Ural_1003 Parity(并查集)
/*发现并查集的应用太巧妙了。。。大体思路:从题中可以看出来如果(i, j)是even的话,sum(i-1) 和 sum(j)的奇偶性相同。(i, j)如果是odd的话则其奇偶行不同。定义奇偶性为朋友,不同则为敌人。 这样按照奇偶性分成连个集合。same[i] = {x|sum[x]与sum[i]同奇偶}(即i的朋友集)diff[i] = {x|sum[x]与sum[i]不同奇偶}(即i的敌人集) 如果(i, j)是even,则分别合并(same(i-1), same(j))和(dirr[i-1] , diff(j))。如果是odd,则因为不是奇就是偶,所以,一个的朋友和另一个的敌人合并(敌人的敌人就是朋友,呵呵) 既合并( same(i-1), diff(j) ), ( diff(i-1), same(j) )。如果出现读入的数据(i, j)的阵营与输入的even,odd不相符的话则说明这句是假话。 ps:数据比较大(10^9),离散化了一下。内存还可以吧,不高不底。^ ^ My Code:*/ #include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm> using namespace std; const int N = 5005;const int block = 5005; struct eq {int x;int y;char s[10];} q[N]; int p[N*2], tmp[N*2];int f[N*2], Rank[N*2];int cnt, n; void init() {for(int i = 0; i <= N+N; i++) { f[i] = i; Rank[i] = 0; }} int get_p(int x) {int l, r, mid; l = 0; r = cnt-1;while(l < r) { mid = (l + r) >> 1;if(p[mid] >= x) r = mid;else l = mid + 1; }return l;} int find(int x) {int k, r, j; r = x; k = x;while(r != f[r]) r = f[r]; while(k != r) { j = f[k]; f[k] = r; k = j; }return r;} void union_set(int x, int y) { x = find(x); y = find(y);if(x == y) return ;if(Rank[x] > Rank[y]) f[y] = x;else { f[x] = y;if(Rank[x] == Rank[y]) ++Rank[y]; }} int main() {//freopen("data.in", "r", stdin); int M, i, x, y;while(~scanf("%d", &M)) {if(M == -1) break; scanf("%d", &n); for(i = 0; i < n; i++) { scanf("%d%d %s", &q[i].x, &q[i].y, q[i].s); q[i].x--; tmp[i*2] = q[i].x; tmp[i*2+1] = q[i].y; } init(); sort(tmp, tmp+n+n); p[0] = tmp[0]; cnt = 1; for(i = 1; i < n+n; i++) {if(tmp[i] != tmp[i-1]) p[cnt++] = tmp[i]; } for(i = 0; i < n; i++) { x = get_p(q[i].x); y = get_p(q[i].y); if(q[i].s[0] == 'e') {if(find(x) == find(y + block)) break; union_set(x, y); union_set(x + block, y + block); } else {if(find(x) == find(y)) break; union_set(x, y + block); union_set(x + block, y); } } printf("%d\n", i); }return 0;}
转载于:https://www.cnblogs.com/vongang/archive/2011/11/22/2259423.html
Ural_1003 Parity(并查集)相关推荐
- 1003. Parity(并查集)
1003 看篇国家论文 <从<parity>的解法谈程序优化> 对于区间i,j 如果用sum[i],sum[j]来表示到i的1的个数的奇偶性 那么仔细想下 sum[i-1] 若 ...
- P5937 [CEOI1999]Parity Game-扩展域并查集与离散化处理
题目链接[CEOI1999]Parity Game - 洛谷 单调队列优化多重背包(全网最详细解析)_秦三马和他的CF生涯的博客-CSDN博客 考察内容,扩展域并查集,本题中把奇偶性相同归为一个集合, ...
- [POJ1733]Parity game(并查集 + 离散化)
传送门 题意:有一个长度已知的01串,给出[l,r]这个区间中的1是奇数个还是偶数个,给出一系列语句问前几个是正确的 思路:如果我们知道[1,2][3,4][5,6]区间的信息,我们可以求出[1,6] ...
- 并查集——奇偶性(Parity)
题目描述 • 有一个 01 序列 , 长度 <=1000000000, 现在有 n 条 信息 , 每条信息的形式是- a b even/odd .表示 第 a 位到第 b 位元素之间的元素总和是 ...
- Parity(带权值的并查集)
你的朋友写下一串包含1和0的串让你猜,你可以从中选择一个连续的子串(例如其中的第3到第5个数字)问他,该子串中包含了奇数个还是偶数个1,他会回答你的问题,然后你可以继续提问......你怀疑朋友的答案 ...
- POJ 并查集 题目汇总 ——czyuan原创(转)
继续数据结构的复习,本次的专题是:并查集. 并查集,顾名思义,干的就是"并"和"查"两件事.很多与集合相关的操作都可以用并查集高效的解决. 两个操作代码: ...
- 【无码专区9】序列统计(带权并查集 + 前缀和建边 + dp)
因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...
- 【转】并查集MST题集
转自:http://blog.csdn.net/shahdza/article/details/7779230 [HDU] 1213 How Many Tables 基础并查集★ 1272 小希的迷宫 ...
- [kuangbin带你飞]专题五 并查集 题解+总结
kuangbin带你飞:点击进入新世界 总结: 本人算是初学者中的初学者,欢迎交流~ 并查集的接触过的不多,大概只有普通并查集,带权并查集,种族并查集,传说中的可持续化并查集只是听说过还没有接触,不过 ...
最新文章
- 最实用的机器学习算法优缺点分析,没有比这篇说得更好了
- 智能音箱AEC中的回采信号
- git merge --squash改写提交
- Nginx+Tomcat windows环境下简单集群搭建
- Android逆向从入门到入土(smali修改,so修改)
- ArcGIS水文分析实战教程(3)DEM数据准备
- 第三季-第20课-多线程程序设计
- 第十三讲:软考中高项13_战略管理、业务流程管理、知识管理
- 精通innodb引擎_《MySQL技术内幕:InnoDB存储引擎》PDF 下载
- Permute 3.6.5 小巧便捷的多媒体文件格式转换器
- Zotero IEEE trans期刊cls格式调整
- Omron 论坛软件下载连接
- 计算机软件高级证书试题,高级程序员认证考试经验总结
- Unity实现人物旋转+移动
- python开根_python如何开根号
- VIM复制指令yank
- STM32 USB_SPI_FLASH 简易U盘设计
- [python爬虫]喜马拉雅音乐
- Learning Shape Representations for Clothing Variations in Person Re-Identification
- 评分卡模型案例(一)| 基础知识
热门文章
- 编译和链接的区别、makefile怎么写
- 【C++】函数的形参
- leetcode - 437. 路径总和 III
- 基于Kmeans算法的文档聚类(包含Java代码及数据格式)
- 利用批处理程序和excel获取windows文件信息
- LZW压缩算法原理解析与实现【转载】
- DCIC巡游车与网约车运营特征对比分析-数据读取
- java kotlin lateinit_15. Kotlin 究竟该不该用 lateinit?
- 电脑壁纸知乎_分享更多美——你一定会喜欢的4K电脑壁纸【011】简约动漫风壁纸...
- vim剪切指定行_10 分钟上手 Vim,常用命令大盘点