hdu2818 Building Block
题意
初始的时候,给定n堆,每一堆有一块砖,并且编号从1到n
给定两种操作方式
(1)M x y 将含有编号为x的一堆砖放置在含有编号为y的那堆砖的上面,如果x,y在同一堆,
则忽略此操作
(2) C x 计算编号为x的砖下面含有砖的个数
源代码
#include<cstdio>
const int maxn = 3e4+3;
int pre[maxn];
int under[maxn];
int sum[maxn];
void init(){
for(int i=0;i<maxn;++i)pre[i]=i,sum[i]=1,under[i]=0;
}
int find(int x)
{
if(x!=pre[x])
{
int t=find(pre[x]);
under[x]+=under[pre[x]];
return pre[x]=t;
}
return x;
}
void Union(int x,int y)
{
x=find(x),y=find(y);
if(x!=y)
{
under[x]=sum[y];
sum[y]+=sum[x];
pre[x]=y;
}
}
int main(){
int p,x,y;
char op[2];
while (~scanf("%d",&p))
{
init();
for(int i=0;i<p;++i){
scanf("%s %d",op,&x);
if(op[0]=='M'){
scanf("%d",&y);
Union(x,y);
}else {
find(x);
printf("%d\n",under[x]);
}
}
}
}