HDU——T 2818 Building Block
阿新 • • 發佈:2017-08-23
ref ota play return include tput select tro miss
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.
Output
Output the count for each C operations in one line.
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
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.
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