这道题,跟叠积木那道题完全一样,可惜我并查集好久没写了,生疏了。当时刚刚学会写题解,没有写注释,尴了个大尬。
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);}}
}