トピックポータル
昨年の冬オフ牛がようやく_ <>、7つの質問を通じて幸せのグループを破りました!
質問の比較的明確な意味は、木材の最小値はいくつかのグループに分けることができ、かつ各ボードの出力はどのグループに割り当てられているあなたを依頼することです。
私はアイデアをプラスソリューションとしてリストされていなかったと言っています(私の思考は、それは非常に素晴らしいです?そのための非主流のそれで?も非常に良いああ何であるかの複雑さを感じます?)
これを取るようになった逆ロックナンバーで、離れて何か他のものからフェンウィックツリーを書きましたが、実際にはない、逆の順序の数を、逆の順序の数がとのように...と言う
xのすべての種類の最初に、ライン上のYフェンウィックツリーのメンテナンス
xとyは、x、xはシーケンスを制御していない、とだけ直線yに考えられ、Yも良いとされた後にその排水、繰り返されていません。
- Y-Yが挿入された挿入する現在のボードよりも小さく、それが友人の最初のグループに配置されている木材に存在しない場合。
- あなたは絵のY-Y、その後、第2のグループを挿入するために、現在のボードよりも木製の唯一の小さなを挿入している場合。
- ?xの挿入厚板があった場合には、Y-Yを挿入する現在のボードよりも小さく、それは、グループ1が、それはX +配置されるべきではない答えはNOである。
例:
4
4 3
3 2
2 1
1 4
それはその数よりも三つの小さな挿入された前のサンプルのセットのために、最後の4を挿入することが、それは第二のグループではなく、第四グループに割り当てる必要があります...だからこそ、逆間違った数... (WA 3ラウンドは...実現しませんでした)
フェンウィックツリーツリーは[k]は最大1-Kに維持されるように、最初のいくつかのグループに割り当てられていた
我々は、我々は最大1-Y見Yの新しい値は、第1及び木のいくつかのグループに割り当てられて挿入すると、 [Y] =ラインアップで最大+ 1、更新!
ACコード:
#include <iostream>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <algorithm>
#define MAX 100010
#define mod 1000000007
#define ll long long
using namespace std;
struct node{
int x,y;
int id;
int ans;
}p[MAX];
int tree[MAX]={0};
int lowbit(int x)
{
return (x&(-x));
}
int find(int x)
{
int ans=0;
while(x)
{
ans=max(tree[x],ans);
x-=lowbit(x);
}
return ans;
}
void insert(int x)
{
int num=find(x)+1;
tree[x]=num;
while(x<MAX)
{
tree[x]=max(tree[x],num);
x+=lowbit(x);
}
}
int cmp1(node a,node b)
{
return a.x>b.x;
}
int cmp2(node a,node b)
{
return a.id<b.id;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>p[i].x>>p[i].y;
p[i].id=i;
}
sort(p,p+n,cmp1);
int m=-1;
int now=1;
for(int i=0;i<n;i++)
{
insert(p[i].y);
p[i].ans=tree[p[i].y];
if(m<p[i].ans)
m=p[i].ans;
}
sort(p,p+n,cmp2);
cout<<m<<endl;
for(int i=0;i<n;i++)
cout<<p[i].ans<<" ";
return 0;
}
/*
5
2 2
3 1
2 1
5 5
5 4
*/
公式のソリューションを投稿:
ディルワース定理は何です...(...あまりにも多くの食べ物が、また、学ぶため)