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.先判断他们是否在一个集合,即父 ...
随机推荐
- JSP页面批量选择&全选操作&选择回显
效果如下: js验证部分: 页面body部分: 附:控制器Controller中验证批量选择条件回显:
- poi过滤操作后产生新的sheet
public Sheet filterSheet(Sheet sheetToFilter){ if(sheetToFilter == null){ System.out.println("s ...
- 手写PE文件(一)
DOS Header(IMAGE_DOS_HEADER)->64 Byte DOS头部 DOS Stub 112字节 "PE"00(Signature) 4个字节 IMAGE ...
- 如何优化C语言代码(程序员必读)
1.选择合适的算法和数据结构 应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍.将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序 ...
- jQuery中的height()、innerheight()、outerheight()的区别总结
在前端jQuery代码中突然看到outerheight(),第一感觉就是,这是什么鬼?然后仔细查阅了一下,居然发现还有这么多相似的东西. 在jQuery中,获取元素高度的函数有3个,它们分别是heig ...
- 各大Oj平台介绍
1.题库与网站资源题库-在线提交系统(Online Judge)简介 下面是几个比较大的在线提交系统(OnlineJudge)里面有大量历年的竞赛题目,注册一个ID,然后用自己熟悉的语言(一般有P ...
- 解决vsftpd日志时间问题
解决vsftpd日志时间问题 发布时间:August 29, 2008 分类:Linux <你必须承认土也是一种艺术> <Linux下查看Apache的请求数> 最近发现vsf ...
- 关闭WordPress自动加载的Open Sans字体-WP访问过慢原因
序言 wordpress大概从wp-3.8开始会自动加载Open Sans字体,并引用Google上面的CSS样式.而最近谷歌经常打不开,导致网站访问速度过慢,严重的会拖慢几十秒.Open Sans字 ...
- Visual Studio 快捷键
Visual Studio 快捷键 CTRL + DELETE 删除至词尾 CTRL + BACKSPACE 删除至词头Ctrl+Shift+L: 删除当前行 Ctrl+K+Crtr+C: 注释选定内 ...
- hdu 3886 Final Kichiku “Lanlanshu” 数位DP
思路: dp[i][j][k]:满足在字符串的j位,前一位数字是k. 代码如下: #include<iostream> #include<cstdio> #include< ...