题目大意:
1~n编号的方块,两个命令M,x放到yshangmian,C计算x下面方块数目;
并查集
开数组cnt[x]保存x下方块数目,top[x]为x最上方一个放块编号
#include<cstdio>
#include<cstring>
#define MAXN 100010
int s[MAXN],cnt[MAXN],top[MAXN];
int Find(int p)
{
if(s[p]<0) return p;
if(s[s[p]]>0)
{
int fa=s[p];
s[p]=Find(fa);
cnt[p]+=cnt[fa];
}
return s[p];
}
void join(int x,int y)
{
x=Find(x);
y=Find(y);
s[x]=y;
Find(top[y]);
cnt[x]=cnt[top[y]]+1;
top[y]=top[x];
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<MAXN;i++)
{
top[i]=i;
s[i]=-1;
cnt[i]=0;
}
while(n--)
{
char str;
scanf(" %c",&str);
if(str=='M')
{
int x,y;
scanf("%d%d",&x,&y);
join(x,y);
}
else
{
int x;
scanf("%d",&x);
Find(x);
printf("%d\n",cnt[x]);
}
}
return 0;
}