Building Block
题意:搬砖。。。每一次可以把a所在的那一堆放到b所在的那一堆上面,问第x号砖下面有几块砖。
记录一下到根节点的距离(dw),以及根节点上方有几块砖(up)。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=30010; 5 int f[maxn],up[maxn],dw[maxn]; 6 7 int gf(int x){ 8 if(x==f[x]){ 9 return x; 10 } 11 int r=f[x]; 12 f[x]=gf(r); 13 dw[x]+=dw[r]; 14 return f[x]; 15 } 16 17 int n; 18 int main(){ 19 // freopen("in.txt","r",stdin); 20 while(scanf("%d",&n)!=EOF){ 21 int ans=0; 22 for(int i=0;i<maxn;i++) {f[i]=i;up[i]=1;dw[i]=0;} 23 for(int i=0;i<n;i++){ 24 int a,b; 25 char c; 26 getchar(); 27 scanf("%c",&c); 28 if(c==‘M‘){ 29 scanf("%d%d",&a,&b); 30 int pa=gf(a),pb=gf(b); 31 if(pa!=pb){ 32 f[pa]=pb; 33 dw[pa]+=up[pb]; 34 up[pb]+=up[pa]; 35 } 36 }else{ 37 scanf("%d",&a); 38 gf(a); 39 printf("%d\n",dw[a]); 40 } 41 } 42 } 43 return 0; 44 }
时间: 2024-12-15 22:07:28