#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int under[30005]; //下面压的木块数量
int wz[30005]; //寻找根节点
int sum[30005]; //根节点对应的堆共有多少个木块
void init()
{
for(int i =1;i<30005;i++)
{
under[i] = 0;
wz[i] = i;
sum[i] = 1;
}
}
int findRoot(int x)
{
if(x == wz[x]) return x;
int t = wz[x];
wz[x] = findRoot(wz[x]);
under[x] += under[t];
return wz[x];
}
void hebing(int rx,int ry)
{
if(rx == ry )
return ;
wz[rx] =ry;
under[rx] = sum[ry];
sum[ry] += sum[rx];
}
int main()
{
init();
int n;
scanf("%d%*c",&n);
char c;
int x,y;
while(n--)
{
scanf("%c",&c);
if(c == 'M')
{
scanf("%d %d%*c",&x,&y);
int rx = findRoot(x);
int ry = findRoot(y);
hebing(rx,ry);
}
else if(c == 'C')
{
scanf("%d%*c",&x);
int k = findRoot(x);
printf("%d\n",under[x]);
}
}
}
Cube Stacking -- 并查集
最新推荐文章于 2022-10-08 10:00:24 发布