分析:
会有人用LCT吗(划掉)?
fa,bot,dis分别维护一个点最上面的点,最底下的点,到最上面的距离。
注意要时刻维护并查集内维护的信息的正确性。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cctype>
inline int read(){
int x=0;char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x;
}
const int MAXN=30005;
int n=30000,p,fa[MAXN],bot[MAXN],dis[MAXN];
int getf(int x){
if(fa[x]==x) return x;
int y=fa[x];
fa[x]=getf(fa[x]);
dis[x]=dis[x]+dis[y];
bot[x]=bot[y];
return fa[x];
}
int main(){
p=read();
for(int i=1;i<=n;i++){
fa[i]=i;
bot[i]=i;
dis[i]=0;
}
while(p--){
char ch=getchar();
while(!isalpha(ch)) ch=getchar();
if(ch=='M'){
int x=read(),y=read();
int xx=getf(x),yy=getf(y);
fa[yy]=xx;
dis[yy]=dis[bot[xx]]+1;
bot[xx]=bot[yy];
getf(bot[x]);getf(bot[y]);
}
else{
int x=read();
getf(x);
getf(bot[x]);
printf("%d\n",dis[bot[x]]-dis[x]);
}
}
return 0;
}