POJ 1988 Cube Stacking(带权并查集)

题意:

给定 n 个 方块, 然后有 p 个操作

操作M (a , b) , 就是将a方块所在的那一堆方块放到 b 上面。

操作C (x) , 就是询问x方块下面有多少方块

分析:

记录方块到父亲的距离dis, 还有最底的方块的cnt。

两个方块合并时,合并方块堆的父亲dis += 最底方块堆的cnt ,最底的方块堆的cnt 加上合并方块堆的 cnt

那么对于每个询问, 只要做一次路径压缩, 从根节点一直更新到询问点, 那么就能更新出询问点的长度

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int Maxn =  10 ;
 4 int P;
 5 int F[Maxn], cnt[Maxn], dis[Maxn];
 6 void init(){
 7     for(int i = 0; i < Maxn; i++)
 8         F[i] = i, cnt[i] = 1, dis[i] = 0;
 9 }
10
11
12 int Find (int x){
13     if (F[x] != x){
14         int temp  = F[x]; //设置延时,最后从父节点回溯的时候再更新,注意与下面的对比
15         F[x] = Find(F[x]);
16         dis[x] += dis[temp];
17         return F[x];
18     }
19     return x;
20 }
21
22 /* 不能写成以下的形式, 因为这样会先更新了自己, 然后再更新父节点
23 int Find (int x){
24     if (F[x] != x){
25         dis[x] += dis[F[x]];
26         F[x] = Find(F[x]);
27         return F[x];
28     }
29     return x;
30 }
31 */
32
33
34 int Merge(int a, int b){
35     int t1 = Find(a), t2 = Find(b);
36     if(t1 != t2){
37         F[t1] = t2; //将t1的根改为t2
38         dis[t1] = cnt[t2]; //那么t1到根的距离就是cnt[t2]
39         cnt[t2] += cnt[t1]; //然后cnt[t2]这一堆就要加上cnt[t1]
40     }
41 }
42 int main(){
43     freopen("debug.txt","r", stdin);
44     init();
45     scanf("%d", &P);
46     while(P--)
47     {
48
49         char ch[9];
50         scanf("%s", ch);
51         if(ch[0] == ‘M‘){
52             int a, b;
53             scanf("%d %d", &a, &b);
54             Merge(a,b);
55         }
56         else{
57             int x;
58             scanf("%d", &x);
59             Find(x);
60             printf("%d\n", dis[x]);
61         }
62     }
63     return 0;
64 }
时间: 2024-10-09 07:58:24

POJ 1988 Cube Stacking(带权并查集)的相关文章

POJ 1988 Cube Stacking (带权并查集)

题目链接:http://poj.org/problem?id=1988 有n个元素,开始每个元素自己 一栈,有两种操作,将含有元素x的栈放在含有y的栈的顶端,合并为一个栈.第二种操作是询问含有x元素下面有多少个元素. 经典的带权并查集,cnt表示包含这个元素的集合中所有元素个数,dis表示这个元素离最上面元素的个数(距离). 看代码领会一下吧. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio>

POJ1988-Cube Stacking(带权并查集)

Cube Stacking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 18858   Accepted: 6547 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

HDU 1988 Cube Stacking (数据结构-并查集)

Cube Stacking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 18900   Accepted: 6568 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

poj 2912 Rochambeau(带权并查集 + 暴力)

题目:poj 2912 Rochambeau(带权并查集 + 暴力) 题目大意:题目给出三个团队和一个裁判,这三个团队和裁判一起玩剪刀石头布,然后规定每个团队必须出一样的,只有裁判可以任意出.然后给出关系,x > y 代表 x 赢y , x < y代表 y 赢 x , 相等则出的一样.问这样的关系可以推出裁判是哪个吗?可以需要说明从第一条到第几条推出来的,不可以也要说明是不可能出现这样的关系,还是裁判不唯一. 解题思路:这题重点是裁判在里面会扰乱关系,并且n * m 才 100000,完全可以

POJ 1182 食物链(带权并查集)

http://poj.org/problem?id=1182 题意: 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同类. 第二种说法是"2 X Y",表示X吃Y. 此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话

POJ 1773 Parity game 带权并查集

分析:带权并查集,就是维护一堆关系 然后就是带权并查集的三步 1:首先确定权值数组,sum[i]代表父节点到子节点之间的1的个数(当然路径压缩后代表到根节点的个数) 1代表是奇数个,0代表偶数个 2:设计路径压缩算法 sum[x]=(sum[x]+sum[t])%2; 3:弄清合并根节点时的操作,小的在上: 注:这个题需要离散化 #include <stdio.h> #include <string.h> #include <algorithm> using names

BZOJ 3362 POJ 1984 Navigation Nightmare 带权并查集

题目大意:一些农场由一些东西向或者南北向的路相互连接.在不断加边的过程中会询问两个农场的曼哈顿距离是多少,如果目前还不连通,那么输出-1. 思路:带权并查集,f[i]为点i到father[i]的距离,要维护两个值,一个是东西向的距离,一个是南北向的距离,因为以后更新的时候要用到.在合并的时候有些特殊.现在有一条边(x->y),设fx为x的根,fy为y的根,那么现在知道f到fx的距离,y到fy的距离,还知道x到y的距离,设fx到fy的距离为dis,则dis + f[y] = f[x] + edge

[POJ 1988] Cube Stacking (带值的并查集)

题目链接:http://poj.org/problem?id=1988 题目大意:给你N个方块,编号从1到N,有两种操作,第一种是M(x,y),意思是将x所在的堆放到y所在的堆上面. 第二种是C(x),意思是数x方块下面有多少个方块. 把两堆合成一堆,这个可以用并查集来实现,问题是,怎么样维护x方块下面有多少个方块呢? 先来分析一下题目,按照样例,我们有6个方块,1,2,3,4,5,6. 令Cnt(x) = C(x)+1. 先执行M(1,6),此时Cnt(1) = 2, Cnt(6) = 1 再

POJ 1182 食物链 (带权并查集)

动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种.有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同类. 第二种说法是"2 X Y",表示X吃Y. 此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的.当一句话满足下列三条之一时,这句话就是假话,否则

POJ 1984 - Navigation Nightmare - [带权并查集]

题目链接:http://poj.org/problem?id=1984 Time Limit: 2000MS Memory Limit: 30000K Case Time Limit: 1000MS Description Farmer John's pastoral neighborhood has N farms (2 <= N <= 40,000), usually numbered/labeled 1..N. A series of M (1 <= M < 40,000)