| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
乱搞1A系列思路很简单,树状数组+并查集维护,然后二分乱搞就行了。
贴:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=200001;
int n,m,tree[MAXN],cat[MAXN],father[MAXN],num;
int lowbit(int x){
return x&-x;
}
int getfather(int x){
return father[x]==x?x:father[x]=getfather(father[x]);
}
void add(int x,int delta){
while(x<=n){
tree[x]+=delta;
x+=lowbit(x);
}
}
int sum(int x){
int Sum=0;
while(x){
Sum+=tree[x];
x-=lowbit(x);
}
return Sum;
}
int find(int l,int r,int x){
int mid=(l+r)/2;
if(l>=r) return mid+(sum(mid)<x?1:0);
if(sum(mid)>=x) return find(l,mid-1,x);
if(sum(mid)<x) return find(mid+1,r,x);
}
int main()
{
scanf("%d%d",&n,&m);
num=n;
for(int i=1;i<=n;i++) father[i]=i;
for(int i=1;i<=n;i++) cat[i]=1;
add(1,n);
for(int i=1;i<=m;i++)
{
int temp;
scanf("%d",&temp);
if(temp)
{
int a;
scanf("%d",&a);
printf("%d\n",find(1,n,num-a+1));
}
else
{
int a,b,fa,fb;
scanf("%d%d",&a,&b);
fa=getfather(a);
fb=getfather(b);
if(fa==fb) continue;
num--;
father[fa]=fb;
add(cat[fa],-1);
add(cat[fb],-1);
cat[fb]+=cat[fa];
add(cat[fb],1);
fa=getfather(a);
}
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator