1. 程式人生 > >HDU——T 2818 Building Block

HDU——T 2818 Building Block

ref ota play return include tput select tro miss

http://acm.hdu.edu.cn/showproblem.php?pid=2818

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5935 Accepted Submission(s): 1838


Problem Description John are playing with blocks. There are N blocks (1 <= N <= 30000) numbered 1...N。Initially, there are N 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 block X up to the pile containing Y. If X and Y are in the same pile, just ignore this command.
C X : Count the number of blocks under block X

You are request to find out the output for each C operation.

Input The first line contains integer P. Then P lines follow, each of which contain an operation describe above.

Output Output the count for each C operations in one 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 | We have carefully selected several similar problems for you: 2819 2817 2821 2820 2822 多組數據、、貌似因為這個WA好多次了、、
 1
#include <algorithm> 2 #include <cstring> 3 #include <cstdio> 4 5 using namespace std; 6 7 const int N(30005); 8 int fa[N],sum[N],beh[N]; 9 10 int find(int x) 11 { 12 if(fa[x]==x) return x; 13 int dad=fa[x]; 14 fa[x]=find(fa[x]); 15 beh[x]+=beh[dad]; 16 return fa[x]; 17 } 18 void combine(int x,int y) 19 { 20 x=find(x),y=find(y); 21 if(x==y) return ; 22 beh[x]=sum[y]; 23 sum[y]+=sum[x]; 24 fa[x]=y; 25 } 26 void init() 27 { 28 for(int i=0;i<N;i++) fa[i]=i,sum[i]=1,beh[i]=0; 29 } 30 31 int main() 32 { 33 for(int p,u,v;~scanf("%d",&p);) 34 { 35 init(); 36 for(char ch[2];p--;) 37 { 38 scanf("%s%d",ch,&u); 39 if(ch[0]==M) 40 { 41 scanf("%d",&v); 42 combine(u,v); 43 } 44 else find(u),printf("%d\n",beh[u]); 45 } 46 } 47 return 0; 48 }

HDU——T 2818 Building Block