poj1988-种类并查集
题意:有N个立方体(1<=N <=30,000),相应地初始时每个立方体放在一个栈中,有两种操作:1、M X Y:把包含第X个立方体的栈中的所有立方体当做一个整体拿出来压入包含第Y个立方体的栈中(即是放在Y栈中的栈顶);2、C X:询问编号为X的立方体下有几个立方体。
思路:把每次1操作后的栈底元素当做根节点。记录栈中元素到根节点的距离h[],记录栈中元素的子节点个数ch[]。Find()路径压缩的时候更新的当前节点到根节点的距离h[]即是h[]加上其原父节点到根节点的距离。合并两个栈元素的时候直接合并两根节点,设根节点为X 和 Y,Y 为新的根节点, X与Y的距离h[X]为X还没放入栈中栈里的元素个数,即
h[x] = ch[Y],ch[Y] += ch[x]。
总结:开始自己想的是只记录更新除父节点数组之外的一个节点信息,然后栈顶元素当父节点,结果掉进了死胡同,后来考虑到栈中元素到栈底的距离才把思路掰回来了。有时候想不明白还是要多想想数据多画画图。
AC代码:
#include <cstdio>
#include <iostream>
#include <vector>
const int maxn = ;
int par[maxn], h[maxn], ch[maxn];
void init()
{
for(int i = ; i < maxn; i++) {
par[i] = i;
h[i] = ;
ch[i] = ;
}
}
int Find(int x)
{
if(x == par[x]) return x;
int t = par[x];
par[x] = Find(par[x]);
h[x] += h[t];
return par[x];
}
void Union(int a, int b)
{
int x = Find(a);
int y = Find(b);
if(x != y) {
par[x] = y;
h[x] = ch[y];
ch[y] += ch[x];
}
} int main()
{
int p;
while(scanf("%d", &p) != EOF) {
init();
while(p--) {
char s[];
scanf("%s", s);
if(s[] == 'M') {
int a, b;
scanf("%d%d", &a, &b);
Union(a, b);
}
else {
int a; scanf("%d", &a);
Find(a);
printf("%d\n", h[a]);
}
}
}
return ;
}
poj1988-种类并查集的更多相关文章
- NOI2001|POJ1182食物链[种类并查集 向量]
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 65430 Accepted: 19283 Description ...
- NOIP2010关押罪犯[并查集|二分答案+二分图染色 | 种类并查集]
题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...
- POJ1703Find them, Catch them[种类并查集]
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 42416 Accepted: ...
- poj1417(种类并查集+dp)
题目:http://poj.org/problem?id=1417 题意:输入三个数m, p, q 分别表示接下来的输入行数,天使数目,恶魔数目: 接下来m行输入形如x, y, ch,ch为yes表示 ...
- poj1733(种类并查集+离散化)
题目链接: http://poj.org/problem?id=1733 题意: 输入n表示有一个长度为n的0,1字符串, m表示接下来有m行输入, 接下来的m行输入中x, y, even表示第x到第 ...
- poj 1182:食物链(种类并查集,食物链问题)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44168 Accepted: 12878 Description ...
- pku 1703(种类并查集)
题目链接:http://poj.org/problem?id=1703 思路;个人觉得本质上还是和带权并查集一样的,只不过多了一个MOD操作,然后就是向量关系图稍微改动一下就变成种类并查集了,对于本题 ...
- hdu 3038 How Many Answers Are Wrong(种类并查集)2009 Multi-University Training Contest 13
了解了种类并查集,同时还知道了一个小技巧,这道题就比较容易了. 其实这是我碰到的第一道种类并查集,实在不会,只好看着别人的代码写.最后半懂不懂的写完了.然后又和别人的代码进行比较,还是不懂,但还是交了 ...
- 【进阶——种类并查集】hdu 1829 A Bug's Life (基础种类并查集)TUD Programming Contest 2005, Darmstadt, Germany
先说说种类并查集吧. 种类并查集是并查集的一种.但是,种类并查集中的数据是分若干类的.具体属于哪一类,有多少类,都要视具体情况而定.当然属于哪一类,要再开一个数组来储存.所以,种类并查集一般有两个数组 ...
- A Bug's Life(hdu1829种类并查集)
题意:有一群虫子,现在给你一些关系,判断这些关心有没有错 思路:向量种类并查集,下面讲一下向量的种类并查集 本题的各个集合的关心有两种0同性,1异性,怎么判断有错, 1.先判断他们是否在一个集合,即父 ...
随机推荐
- shell编程之echo命令
Linux echo命令不能显示文件中的内容.显示字符串或者变量功能说明:显示文字.语 法:echo [-ne][字符串]或 echo [--help][--version]补充说明:echo会将输入 ...
- hdu 3487 Play with Chain
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3487 YaoYao is fond of playing his chains. He has a c ...
- [工作积累] android 中添加libssl和libcurl
1. libssl https://github.com/guardianproject/openssl-android 然后执行ndk-build 2.libcurl 源代码组织结构, 下面的mak ...
- Topcoder 多校T-shirt场
盗用名字:C题题目都没看懂, B:You are given a long long n. Return the largest divisor of n that is a perfect squa ...
- 离散-ACM一道强有力的工具
最近几天散搞哭了,都怪以前看到没好好学... 就拿一道题来说事PKU:1151,以前Matrix67写过这道题的BLOG,引用一下: VOJ1056(http://www.vijos.cn/Probl ...
- 2013年优秀jQuery插件
今天为大家推荐的是2013年的第一期,在这期里面十个jQuery插件涵盖了响应式的网格布局插件.图片放大插件.表单元素中自定义select插件,google 地图插件.文件拖放上传插件.tooltip ...
- 一篇不错的讲解Java异常的文章(转载)
http://www.blogjava.net/freeman1984/archive/2007/09/27/148850.html 六种异常处理的陋习 你觉得自己是一个Java专家吗?是否肯定自己已 ...
- AESEncrypter加密算法代码示例
package testJava.java; import java.security.SecureRandom; import java.util.Base64; import javax.cryp ...
- Windows Server
1. Windows Server 在试用license过期后会出现2小时一次的关机.如果暂时无法注册或者激活,下面的方法可以试试 taskkill /f /im wlms.exe ping -n 1 ...
- light oj 1393 - Crazy Calendar 博弈论
思路:当移到右下角时,就不能移动了.所以与右下角的奇偶性相同的位置,都不能直接到达,先手必败! 只需考虑与右下角奇偶不同的位置,可以看成NIM博弈.最后NIM和不为0的胜,否者败!! 代码如下: #i ...