POJ 1988 Cube Stacking
题意:有编号为1~N的N个小木块,有两种操作
- M x y 将木块x所在的堆放到木块y所在的堆的上面
- 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相关推荐
- 3376: [Usaco2004 Open]Cube Stacking 方块游戏(带权并查集)
3376: [Usaco2004 Open]Cube Stacking 方块游戏 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 256 Solve ...
- POJ1988 Cube Stacking
原题传送:http://poj.org/problem?id=1988 一开始的想法是把下堆连到上堆去(这很符合树的结构思想),然后另外开一个数组标记录节点的值,递归的时候字节点加上这个标记的值与根节 ...
- A - Cube Stacking(带权并查集)
题目描述 Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)identical cubes labeled ...
- poj 1988(并查集)
题意:进行m次操作,M x y 将包含x的集合移动到y上面,C x, 计算x下面有几个元素. 解题思路:这道题很容易想到用并查集,但是这里有点绕:最开始我想到的是建立一个num[x],表示x以下的节点 ...
- POJ 1128 Frame Stacking 拓扑排序+暴搜
这道题输出特别坑.... 题目的意思也不太好理解.. 就解释一下输出吧.. 它让你 从下往上输出. 如果有多种情况,按照字典序从小往大输出... 就是这个多种情况是怎么产生的呢. 下面给一组样例. 很 ...
- 并查集入门+初级专题训练
介绍 摘自罗勇军,郭卫斌的<算法竞赛入门到进阶>上的说明: 并查集(Disjoint Set)是一种非常精巧而且食用的数据结构,它主要用于处理一些不相交集合的合并问题.经典的例子有 ...
- linux怎么退出shell编程,Linux Shell编程(11)——退出和退出状态
exit命令一般用于结束一个脚本,就像C语言的exit一样.它也能返回一个值给父进程. 每一个命令都能返回一个退出状态(有时也看做返回状态).一个命令执行成功返回0,一个执行不成功的命令则返回一个非零 ...
- mysql oradba,使用SQL语句查询表及表字段类型说明
今天突然遇到有人要数据库表及表字段说明,数据库表太多又不能一个个表去找,就想想SQL是否能直接查询出来. 经过查询资料,加上一些自己的一些调整写了一个sql语句,在此记录一下,以方便日后查找使用. S ...
- POJ前面的题目算法思路【转】
1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...
最新文章
- SAP S4HANA 介绍LTMC的文章链接
- 【编译原理】让我们来构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 5.)(python/c/c++版)(笔记)Lexer词法分析程序
- 单独安装想要的office_安装OFFICE不再求人,最省心的方法
- JS的条形码和二维码生成
- eclipse无法打开.ftl文件或打开.ftl没提示
- java swing 帮助文档,在Java Swing应用程序中创建在线帮助-使用pdf用户文档
- Java学习笔记--字符串和文件IO
- WPF中改进自定义Command一些想法
- AOJ0006 Reverse Sequence【堆栈+字符流】
- 使用AST进行JavaScript反混淆(2022年增值税发票查验js)
- STK与VC++ 6.0联合编程
- linux英英词典项目,[开发手记] 一款基于命令行的英英词典 (A CLI-Based EE Dictionary)...
- 手机如何访问电脑局域网文件共享服务器,手机怎么访问局域网电脑共享文件
- mac桌面存在顽固文件无法删除?怎么办?
- 网站打开慢解决办法——在Google Chrome浏览器中安装ReplaceGoogleCDN插件
- Android图片轮播控件——Banner
- 微信小程序 表情小作坊 — 轻松定制表情包 1
- drupal用户注册邮件smtp及社会化登录模块安装
- Java语言制作动画
- The server time zone value 'EDT' is unrecognized or represents more than one time zone.
热门文章
- mysql启动报错解决-1
- 软件工程革命 三部曲 —— 前传
- MyBatis 一级缓存二级缓存详解
- 蓝桥杯 ADV-13 算法提高 最小乘积(提高型)
- 蓝桥杯 ADV-134算法提高 校门外的树
- python打乱数据集_在Keras中利用np.random.shuffle()打乱数据集实例
- svn 导入的 web项目怎么变成了java项目了
- OpenCV3 for python3 学习笔记3-----用OpenCV3处理图像2
- 微软推出Windows Sandbox:可安全运行任何应用的一次性VM\n
- 不想remote的程序员跟咸鱼有什么区别?