这道题,跟叠积木那道题完全一样,可惜我并查集好久没写了,生疏了。当时刚刚学会写题解,没有写注释,尴了个大尬。
v表示某堆栈上方有多少堆栈,d表示下方有多少
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn=2e5+10;
int n,p;
int z,x,y;
int f[maxn],d[maxn],v[maxn];
inline void init(){
for(int i=1;i<=p;i++)
f[i]=i,d[i]=1;
}
int get(int x){
if(f[x]==x)
return x;
int t=get(f[x]);
v[x]=v[x]+v[f[x]];
return f[x]=t;
}
void merge(int x,int y){
int t1=get(x);
int t2=get(y);
f[t2]=t1;
v[t2]=d[t1];//t2的栈顶数等于t1下面的数量
d[t1]+=d[t2];//t1栈底加上t2的数量
}
int main()
{
scanf("%d",&p);
init();
while(p--){
char c;int x,y;
cin>>c;
if(c=='M'){
scanf("%d%d",&x,&y);
merge(x,y);
}
else{
scanf("%d",&x);
printf("%d\n",d[get(x)]-v[x]-1);
}
}
}