#P2995. USACO(49.1)并查集2:叠积木[Cube Stacking, 2004 Open]

USACO(49.1)并查集2:叠积木[Cube Stacking, 2004 Open]

Description

注:此题数据中 $N$ 的最大范围为 $10^5$。  
 

6
M 1 6
C 1
M 2 4
M 2 6
C 3
C 4
1
0
2

Hint

by hansang:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int fa[N], ft[N], sum[N];
int findfa(int x){
	if(fa[x]==x) return fa[x];
	int f=fa[x];
	int tx=findfa(fa[x]);
	ft[x]+=ft[f];
	sum[x]=sum[f];
	return fa[x]=tx;
}
int main(){
	int n; scanf("%d", &n);
	for(int i=1; i<=n; i++) fa[i]=i, ft[i]=0, sum[i]=1;
	for(int i=1; i<=n; i++){
		char s[5]; scanf("%s", s);
		if(s[0]=='M'){
			int x, y; scanf("%d%d", &x, &y);
			int tx=findfa(x), ty=findfa(y);
			fa[ty]=tx; ft[ty]=sum[tx];
			sum[tx]+=sum[ty]; 
		}
		else{
			int x; scanf("%d", &x);
			int tx=findfa(x);
			printf("%d\n", sum[x]-ft[x]-1);
		}
	}
	return 0;
}