题目描述很简单就是有N个盒子,标号分别为1-N,现有两种操作,一种是移动,将包含x的整体方块移到包含y的整体方块的上方,注意是整体移动,另一种为读取操作,输出在x下方方块的个数,那么对于这题感觉就是并查集路径压缩以及更新结点的典型,我们定义一个偏移量代表子节点与根节点的距离,然后定义一个son数组代表x下方的结点的个数,这样用根节点的son--所求结点的偏移量-1 就是x下方的方块数量了:下面是代码:
#include <stdio.h>
#include <stdlib.h>
#define Max 30001
int pre[Max];
int son[Max];
int set[Max];
int find(int x){
if(x==set[x])
return x;
int temp=set[x];
set[x]=find(set[x]);
pre[x]+=pre[temp];
return set[x];
}
int p;
int main()
{
scanf("%d",&p);
for(int i=1;i<Max;i++){
pre[i]=0;
son[i]=1;
set[i]=i;
}
int a,b,c,x,y;
while(p--){
getchar();
if(getchar()=='M'){
scanf("%d%d",&a,&b);
x=find(a);
y=find(b);
set[y]=x;
pre[y]=son[x];
son[x]+=son[y];
}
else{
scanf("%d",&c);
printf("%d\n",son[find(c)]-pre[c]-1);
}
}
return 0;
}