思路:就是带权并查集的模板.
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<map>
#include<set>
#include<algorithm>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
int f[1000000],Rank[1000000],num[1000000];
int fi(int r)
{
if(r==f[r]) return r;
int tmp=f[r];
f[r]=fi(f[r]);
Rank[r]+=Rank[tmp];
return f[r];
}
void mer(int x,int y)
{
f[x]=y;//将大的节点设为根节点
Rank[x]+=num[y];//更新后节点x的位置要加上合并的y集合中的元素
num[y]+=num[x];//将前一集合中的元素合并到后一集合中
}
int main()
{
int n,m,i,j,k,a,b,x,y;
char c;
scanf("%d",&n);
getchar();
for(i=1; i<=30000; i++)
{
f[i]=i;
Rank[i]=0;
num[i]=1;
}
m=n;
while(n--)
{
scanf("%c",&c);
if(c=='M')
{
scanf("%d%d",&a,&b);
getchar();
x=fi(a);
y=fi(b);
if(x!=y)
mer(x,y);
}
else
{
scanf("%d",&a);
getchar();
fi(a);//注意在输出前要重新更新以下,因为在动态更新的时候不是理想的
printf("%d\n",Rank[a]);//压缩状态
}
}
return 0;
}