复习一下并查集的统计问题
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#define maxn 30020
using namespace std;
struct PPPP
{
int fa;
int v;//表示该点的上方不包括该点有多少个方块
}p[maxn];
int top[maxn];//表示包括该点的下方一共有多少个方块
int n;
int find(int x)
{
int ff=p[x].fa;
if(ff==x)return x;
p[x].fa=find(ff);
p[x].v+=p[ff].v;
return p[x].fa;
}
void merge(int x,int y)
{
x=find(x);
y=find(y);
p[y].fa=x;
p[y].v+=top[x];
top[x]+=top[y];
}
void get_ans(int x)
{
int t=find(x);
printf("%d\n",top[t]-p[x].v-1);
}
int main()
{
freopen("1988.txt","r",stdin);
char cmd[10];
int x,y;
scanf("%d",&n);
for(int i=1;i<=maxn;i++)
{
p[i].fa=i;
p[i].v=0;
top[i]=1;
}
while(n--)
{
scanf("%s",cmd);
switch (cmd[0])
{
case 'M':scanf("%d%d",&x,&y);merge(x,y);break;
case 'C':scanf("%d",&x);get_ans(x);break;
default:cout<<"额贼!";
}
}
return 0;
}