Luogu P2342 叠积木 加权并查集

可能这是一类题目吧,这道题比较典型,可以当作模板。

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4
 5 const int Maxn = 30030;
 6
 7 int fa[Maxn],d[Maxn],size[Maxn];
 8 int find(int x){
 9     if(fa[x] == x)return x;
10     int rt = find(fa[x]);
11     d[x] += d[fa[x]];
12     return fa[x] = rt;
13 }
14
15 void merge(int x,int y){
16     x = find(x),y = find(y);
17     if(x != y){
18         fa[x] = y;
19         d[x] = size[y],size[y] += size[x];
20     }
21 }
22
23 int p,x,y;
24 char ch;
25
26 int main(){
27     for(int i = 1;i <= 30000;i++)fa[i] = i,size[i] = 1,d[i] = 0;
28     cin >> p;
29     while(p--){
30         cin >> ch;
31         if(ch == ‘C‘){
32             cin >> x;
33             find(x);
34             cout << d[x] << ‘\n‘;
35         }
36         else{
37             cin >> x >> y;
38             merge(x,y);
39         }
40     }
41 return 0;
42 }

原文地址:https://www.cnblogs.com/Wangsheng5/p/11688974.html

时间: 2024-10-18 13:38:18

Luogu P2342 叠积木 加权并查集的相关文章

[luoguP2342] 叠积木(并查集)

传送门 up[i] 表示一个木块上面有多少个 all[i] 表示整个连通块内有多少个 那么 一个木块下面的木块个数为 all[root[i]] - up[i] - 1 注意:up[i] 可以在 find 函数中维护,而 all[i] 不好维护,那么我们只需要祖先节点的 all[i] 表示整个连通块内木块的数目即可 合并时也注意维护 ——代码 1 #include <cstdio> 2 #include <iostream> 3 #define N 1000001 4 5 int n

P2342 叠积木

P2342 叠积木 17通过 66提交 题目提供者wwqk4444 标签树状数组线段树USACO 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 暂时没有讨论 题目背景 Cube Stacking, 2004 Open 题目描述 约翰和贝西在叠积木.共有30000块积木,编号为1到30000.一开始,这些积木放在 地上,自然地分成N堆.贝西接受约翰的指示,把一些积木叠在另一些积木的上面.一旦两 块积木相叠, 彼此就再也不会分开了,所以最后叠在一起的积木会越来越高.约翰让贝西依 次执行P条

HDU 3407.Zjnu Stadium 加权并查集

Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3726    Accepted Submission(s): 1415 Problem Description In 12th Zhejiang College Students Games 2007, there was a new stadium built

P1196 银河英雄传说(加权并查集)

P1196 银河英雄传说 题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压 顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨 威利组织麾下三万艘战舰迎敌. 杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气.在 这次决战中,他将巴米利恩星域战场划分成30000列,每列依次编号为1, 2, …, 30000.之后

Zjnu Stadium(加权并查集)

Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3186    Accepted Submission(s): 1226 Problem Description In 12th Zhejiang College Students Games 2007, there was a new stadium built

uva 12232 - Exclusive-OR(加权并查集)

题目链接:uva 12232 - Exclusive-OR 题目大意:有n个数,一开始并不知道具体的值,现在进行Q次操作. I u k:au的值为k I u v k:au?av=k Q k q1q2-qk:求q1?q2-?qk 对于Q操作不能确定的话输出"I don't know." 对于I操作矛盾的话则输出是第几条I操作出现矛盾的,并且停止后面所有的操作. 解题思路:加权并查集,f[x]表示x节点父亲节点,d[x]表示x节点与其父节点的亦或值,对于确定的节点值,可以将父亲节点设为0,

加权并查集——(POJ1988)Cube Stacking

Cube Stacking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 25647   Accepted: 8975 Case Time Limit: 1000MS Description Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)identical cubes labeled 1 through N. They start w

UVALive 4487 Exclusive-OR 加权并查集神题

已知有 x[0-(n-1)],但是不知道具体的值,题目给定的信息 只有 I P V,说明 Xp=V,或者 I P Q V,说明 Xp ^ Xq=v,然后要求回答每个询问,询问的是 某任意的序列值 Xp1^Xp2,,,,X^pk 这个题目用加权并查集是这么处理的: 1. f[]照样是代表父节点,照样进行路径压缩,把每个 V[i]=V[i]^V[f[i]],即节点存储的值实际是它与它父亲的异或的值.为什么要这样呢,因为异或首先满足交换律,而且异或同一个数偶数次,即相当于本身,那么这个题目的其中一个要

加权并查集

加权并查集是一种特殊的并查集,除可提供查询操作外,还可用于表示元素与其代表元素的关系.下面以食物链为例,讲解一下加权并查集. #include<cstdio> //调用cstdio库,使用getchar函数 #include<cctype> //调用cctype库,使用isdigit函数,返回参数是否为整数 int N,K,ans,r,x,y; //定义变量用于有几个动物,几句话,答案,以及动物的关系和两个要描述的动物 int f[50005],d[50005]; //定义数组记录