题意:有编号为1~N的N个小木块,有两种操作

  1. M x y 将木块x所在的堆放到木块y所在的堆的上面
  2. C x 询问木块x下面有多少块木块

代码巧妙就巧妙在GetParent函数中在进行路径压缩的同时,也计算好了该木块对应的under值

这个需要好好体会

 1 //#define LOCAL
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6
 7 const int maxn = 30000 + 10;
 8 int parent[maxn], under[maxn], sum[maxn];
 9
10 int GetParent(int a)
11 {
12     if(parent[a] == a)
13         return a;
14     int t = GetParent(parent[a]);
15     under[a] += under[parent[a]];
16     parent[a] = t;
17     return t;
18 }
19
20 void Merge(int a, int b)
21 {
22     int pa = GetParent(a);
23     int pb = GetParent(b);
24     if(pa == pb)    return;
25     parent[pb] = pa;
26     under[pb] = sum[pa];
27     sum[pa] += sum[pb];
28 }
29
30 int main(void)
31 {
32     #ifdef LOCAL
33         freopen("1988in.txt", "r", stdin);
34     #endif
35
36     for(int i = 1; i < maxn; ++i)
37     {
38         parent[i] = i;
39         under[i] = 0;
40         sum[i] = 1;
41     }
42     int n;
43     scanf("%d", &n);
44     getchar();
45     for(int i = 0; i < n; ++i)
46     {
47         char p;
48         scanf("%c", &p);
49         if(p == 'M')
50         {
51             int a, b;
52             scanf("%d%d", &a, &b);
53             getchar();
54             Merge(b, a);
55         }
56         else
57         {
58             int a;
59             scanf("%d", &a);
60             getchar();
61             GetParent(a);
62             printf("%d\n", under[a]);
63         }
64     }
65     return 0;
66 }

代码君

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/3932491.html

POJ 1988 Cube Stacking相关推荐

  1. 3376: [Usaco2004 Open]Cube Stacking 方块游戏(带权并查集)

    3376: [Usaco2004 Open]Cube Stacking 方块游戏 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 256  Solve ...

  2. POJ1988 Cube Stacking

    原题传送:http://poj.org/problem?id=1988 一开始的想法是把下堆连到上堆去(这很符合树的结构思想),然后另外开一个数组标记录节点的值,递归的时候字节点加上这个标记的值与根节 ...

  3. A - Cube Stacking(带权并查集)

    题目描述 Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)identical cubes labeled ...

  4. poj 1988(并查集)

    题意:进行m次操作,M x y 将包含x的集合移动到y上面,C x, 计算x下面有几个元素. 解题思路:这道题很容易想到用并查集,但是这里有点绕:最开始我想到的是建立一个num[x],表示x以下的节点 ...

  5. POJ 1128 Frame Stacking 拓扑排序+暴搜

    这道题输出特别坑.... 题目的意思也不太好理解.. 就解释一下输出吧.. 它让你 从下往上输出. 如果有多种情况,按照字典序从小往大输出... 就是这个多种情况是怎么产生的呢. 下面给一组样例. 很 ...

  6. 并查集入门+初级专题训练

    介绍   摘自罗勇军,郭卫斌的<算法竞赛入门到进阶>上的说明:   并查集(Disjoint Set)是一种非常精巧而且食用的数据结构,它主要用于处理一些不相交集合的合并问题.经典的例子有 ...

  7. linux怎么退出shell编程,Linux Shell编程(11)——退出和退出状态

    exit命令一般用于结束一个脚本,就像C语言的exit一样.它也能返回一个值给父进程. 每一个命令都能返回一个退出状态(有时也看做返回状态).一个命令执行成功返回0,一个执行不成功的命令则返回一个非零 ...

  8. mysql oradba,使用SQL语句查询表及表字段类型说明

    今天突然遇到有人要数据库表及表字段说明,数据库表太多又不能一个个表去找,就想想SQL是否能直接查询出来. 经过查询资料,加上一些自己的一些调整写了一个sql语句,在此记录一下,以方便日后查找使用. S ...

  9. POJ前面的题目算法思路【转】

    1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...

最新文章

  1. SAP S4HANA 介绍LTMC的文章链接
  2. 【编译原理】让我们来构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 5.)(python/c/c++版)(笔记)Lexer词法分析程序
  3. 单独安装想要的office_安装OFFICE不再求人,最省心的方法
  4. JS的条形码和二维码生成
  5. eclipse无法打开.ftl文件或打开.ftl没提示
  6. java swing 帮助文档,在Java Swing应用程序中创建在线帮助-使用pdf用户文档
  7. Java学习笔记--字符串和文件IO
  8. WPF中改进自定义Command一些想法
  9. AOJ0006 Reverse Sequence【堆栈+字符流】
  10. 使用AST进行JavaScript反混淆(2022年增值税发票查验js)
  11. STK与VC++ 6.0联合编程
  12. linux英英词典项目,[开发手记] 一款基于命令行的英英词典 (A CLI-Based EE Dictionary)...
  13. 手机如何访问电脑局域网文件共享服务器,手机怎么访问局域网电脑共享文件
  14. mac桌面存在顽固文件无法删除?怎么办?
  15. 网站打开慢解决办法——在Google Chrome浏览器中安装ReplaceGoogleCDN插件
  16. Android图片轮播控件——Banner
  17. 微信小程序 表情小作坊 — 轻松定制表情包 1
  18. drupal用户注册邮件smtp及社会化登录模块安装
  19. Java语言制作动画
  20. The server time zone value 'EDT' is unrecognized or represents more than one time zone.

热门文章

  1. mysql启动报错解决-1
  2. 软件工程革命 三部曲 —— 前传
  3. MyBatis 一级缓存二级缓存详解
  4. 蓝桥杯 ADV-13 算法提高 最小乘积(提高型)
  5. 蓝桥杯 ADV-134算法提高 校门外的树
  6. python打乱数据集_在Keras中利用np.random.shuffle()打乱数据集实例
  7. svn 导入的 web项目怎么变成了java项目了
  8. OpenCV3 for python3 学习笔记3-----用OpenCV3处理图像2
  9. 微软推出Windows Sandbox:可安全运行任何应用的一次性VM\n
  10. 不想remote的程序员跟咸鱼有什么区别?