自己太逗了,,这题都没有自己写出来。。
1:不知道反着想,某个盒子下面的数=它上面的集合的数-他上面的数。。还是要看书。。
2:自己的又忘了要在这个地方路径压缩的时候要记得吧up【】弄好。。。
int fa[N],sum[N];
int up[N];
int Find(int x){
int fx=fa[x];
if(fa[x]!=x){
fx=Find(fa[x]);
up[x]+=up[fa[x]];
}
return fa[x]=fx;
}
void uni(int x,int y){
int fx=Find(x),fy=Find(y);
fa[fy]=fx;
up[fy]+=sum[fx];
sum[fx]+=sum[fy];
}
int main(){
int n;
while(~sf("%d",&n)){
rep(i,1,30000)fa[i]=i,sum[i]=1,up[i]=0;
rep(i,1,n){
char op[3];sf("%s",op);
int x,y;
if(op[0]=='M'){
sf("%d%d",&x,&y);
uni(x,y);
}
else{
sf("%d",&x);int par=Find(x);
pf("%d\n",sum[par]-up[x]-1);
}
}
}
}