pku 1988 poj Cube Stacking 并查集
两种操作,叠立方体,数某个立方体下面有几个立方体;操作次数很多,采用并查集实现
其中above[i]表示在 i 上面的立方体个数
sum[i]表示根节点i下面的立方体个数,包括i
所以x下面的立方体个数就等于x的根节点下面的总的立方体个数减去x上面的立方体个数
(直接记录x的下面的立方体个数貌似有难度)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h>
#include<string.h>
#define MAX 30010
int fa[MAX],sum[MAX],above[MAX];
void init()
{
for(int i=0;i<=30000;i++)
{
fa[i]=i;
sum[i]=1;
above[i]=0;
}
}
int find(int x)
{
if(x==fa[x]) return x;
int tx=find(fa[x]);
above[x]+=above[fa[x]];
fa[x]=tx;
return tx;
}
void unio(int x,int y)
{
int tx=find(x);
int ty=find(y);
fa[ty]=tx;
above[ty]=sum[tx];
sum[tx]+=sum[ty];
}
int main()
{
int p,x,y;
char str[5];
scanf("%d",&p);
init();
while(p--)
{
scanf("%s",str);
if(str[0]=='M')
{
scanf("%d%d",&x,&y);
unio(x,y);
}
else
{
scanf("%d",&x);
printf("%d\n",sum[find(x)]-above[x]-1);
}
}
return0;
}