hdu2818 2010.3.6
hdu 2818
摞方块并查集
Building Block
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 340 Accepted Submission(s): 86
Problem Description
John are playing with blocks. There are Nblocks (1 <= N <= 30000) numbered 1...N。Initially, there areN piles, and each pile contains one block. Then John do some operations P times(1 <= P <= 1000000). There are two kinds of operation:
M X Y : Put the whole pile containing blockX up to the pile containing Y. If X and Y are in the same pile, just ignorethis command.
C X : Count the number of blocks underblock X
You are request to find out the output foreach C operation.
Input
The first line contains integer P. Then Plines follow, each of which contain an operation describe above.
Output
Output the count for each C operations inone line.
Sample Input
6
M 1 6
C 1
M 2 4
M 2 6
C 3
C 4
Sample Output
1
0
2
Source
2009 Multi-University Training Contest 1 -Host by TJU
Recommend
gaojie
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 30000+10
int father[N],block[N];
int find(int key)
{
int resultkey=key;
if(father[key]>=0)
{
resultkey=find(father[key]);
block[key]+=block[father[key]];
father[key]=resultkey;
}
return resultkey;
}
int main()
{
char ch,mid[100];
int k,p;
scanf("%d",&p);
memset(father,-1,sizeof(father));
memset(block,0,sizeof(block));
for(k=1;k<=p;k++)
{
gets(mid);
scanf("%c",&ch);
if(ch=='M')
{
int x,y;
scanf("%d %d",&x,&y);
int rx=find(x),ry=find(y);
if (rx!=ry)
{
block[ry]=-father[rx];
father[rx]+=father[ry];
father[ry]=rx;
}
}
else
{
int x;
scanf("%d",&x);
printf("%d\n",-father[find(x)]-block[x]-1);
}
}
return 0;
}