带权并查集模板

题目描述

约翰和贝茜在玩一个方块游戏。编号为1…n的n(1≤n≤30000)个方块正放在地上,每个构成一个立方柱。
游戏开始后,约翰会给贝茜发出P(1≤P≤100000)个指令。指令有两种:
移动(M):将包含 X 的立方柱移动到包含 Y 的立方柱上。
统计(C):统计含 X 的立方柱中,在 X 下方的方块数目。
写个程序帮贝茜完成游戏。

输入

第1行输入P,之后P行每行输入一条指令,形式为 M X Y 或者 C X。
输入保证不会有将立方柱放在自己头上的指令。

输出

输出共P行,对于每个统计指令,输出其结果。

样例

输入
6
M 1 6
C 1
M 2 4
M 2 6
C 3
C 4
输出
1
0
2

 

//带权并查集
#include <bits/stdc++.h>
using namespace std;
int f[40010] , dis[40010] , len[40010];
int p;
int find( int x ){
	if ( x == f[x] ) return x;
	else{
		int t = f[x];
		f[x] = find(f[x]);
		dis[x] = dis[x] + dis[t];
		return f[x];
	}
}
void merge(int x, int y){
	int fx = find(x) , fy = find(y);
	if ( fx != fy ){
		f[fx] = fy;
		dis[fx] = dis[fx] + len[fy];
		len[fy] = len[fy] + len[fx];
		len[fx] = 0;
	}
}
int main(){
	cin >> p;
	for ( int i = 1 ; i <= 30000 ; i++ ){
		f[i]=i;
		len[i] = 1;
	}
	char  c;
	int x , y , ans[100010] , k=1;
	for ( int i = 1 ; i <= p ; i++ ){
		cin >> c >> x;
		if ( c == 'C' ){
			find(x);
			ans[k++] =  dis[x] ;
		}
		else{
			cin >> y;
			merge(x , y);
		}
	}
	for ( int i = 1 ; i <= k-1 ; i++ )
		printf("%d\n" , ans[i]);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值