嘛 又是一道带权并查集
不过这题要带多一点好玩的东西
f[x]表示其所在树根不用说 然后多设一个d[x]表示当前积木块最底端的是哪个 p[x]表示在x上面有多少个
求值的时候就p[d[x]]-p[x]就好
记得修改完要更新啊 因为有些地方是下面也要更新的 比如 你说呢?(这个自己想想~)
不懂就看代码咯。。
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int N=30002,inf=1e9;
inline int read()
{
int x=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int f[N],p[N],d[N];
int fa(int x)
{
if(x==f[x])return x;
int y=f[x];
f[x]=fa(f[x]),d[x]=d[y],p[x]+=p[y];
return f[x];
}
int main()
{
int i,x,y,fx,fy,m=read(); char ch;
for(i=1;i<N;i++)d[i]=f[i]=i,p[i]=0;
while(m--)
{
scanf("\n%c",&ch);
if(ch=='M')
{
x=read(),y=read(),fx=fa(x),fy=fa(y);
int k=fa(d[fx]);
f[fy]=fx,p[fy]=p[d[fx]]+1,d[fx]=d[fy];
}
else
{
x=read(),fx=fa(x);
int k=fa(d[fx]);
printf("%d\n",p[d[x]]-p[x]);
}
}
return 0;
}