/*发现并查集的应用太巧妙了。。。大体思路:从题中可以看出来如果(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(并查集)相关推荐

  1. 1003. Parity(并查集)

    1003 看篇国家论文 <从<parity>的解法谈程序优化> 对于区间i,j 如果用sum[i],sum[j]来表示到i的1的个数的奇偶性 那么仔细想下 sum[i-1] 若 ...

  2. P5937 [CEOI1999]Parity Game-扩展域并查集与离散化处理

    题目链接[CEOI1999]Parity Game - 洛谷 单调队列优化多重背包(全网最详细解析)_秦三马和他的CF生涯的博客-CSDN博客 考察内容,扩展域并查集,本题中把奇偶性相同归为一个集合, ...

  3. [POJ1733]Parity game(并查集 + 离散化)

    传送门 题意:有一个长度已知的01串,给出[l,r]这个区间中的1是奇数个还是偶数个,给出一系列语句问前几个是正确的 思路:如果我们知道[1,2][3,4][5,6]区间的信息,我们可以求出[1,6] ...

  4. 并查集——奇偶性(Parity)

    题目描述 • 有一个 01 序列 , 长度 <=1000000000, 现在有 n 条 信息 , 每条信息的形式是- a b even/odd .表示 第 a 位到第 b 位元素之间的元素总和是 ...

  5. Parity(带权值的并查集)

    你的朋友写下一串包含1和0的串让你猜,你可以从中选择一个连续的子串(例如其中的第3到第5个数字)问他,该子串中包含了奇数个还是偶数个1,他会回答你的问题,然后你可以继续提问......你怀疑朋友的答案 ...

  6. POJ 并查集 题目汇总 ——czyuan原创(转)

    继续数据结构的复习,本次的专题是:并查集. 并查集,顾名思义,干的就是"并"和"查"两件事.很多与集合相关的操作都可以用并查集高效的解决. 两个操作代码:    ...

  7. 【无码专区9】序列统计(带权并查集 + 前缀和建边 + dp)

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...

  8. 【转】并查集MST题集

    转自:http://blog.csdn.net/shahdza/article/details/7779230 [HDU] 1213 How Many Tables 基础并查集★ 1272 小希的迷宫 ...

  9. [kuangbin带你飞]专题五 并查集 题解+总结

    kuangbin带你飞:点击进入新世界 总结: 本人算是初学者中的初学者,欢迎交流~ 并查集的接触过的不多,大概只有普通并查集,带权并查集,种族并查集,传说中的可持续化并查集只是听说过还没有接触,不过 ...

最新文章

  1. 最实用的机器学习算法优缺点分析,没有比这篇说得更好了
  2. 智能音箱AEC中的回采信号
  3. git merge --squash改写提交
  4. Nginx+Tomcat windows环境下简单集群搭建
  5. Android逆向从入门到入土(smali修改,so修改)
  6. ArcGIS水文分析实战教程(3)DEM数据准备
  7. 第三季-第20课-多线程程序设计
  8. 第十三讲:软考中高项13_战略管理、业务流程管理、知识管理
  9. 精通innodb引擎_《MySQL技术内幕:InnoDB存储引擎》PDF 下载
  10. Permute 3.6.5 小巧便捷的多媒体文件格式转换器
  11. Zotero IEEE trans期刊cls格式调整
  12. Omron 论坛软件下载连接
  13. 计算机软件高级证书试题,高级程序员认证考试经验总结
  14. Unity实现人物旋转+移动
  15. python开根_python如何开根号
  16. VIM复制指令yank
  17. STM32 USB_SPI_FLASH 简易U盘设计
  18. [python爬虫]喜马拉雅音乐
  19. Learning Shape Representations for Clothing Variations in Person Re-Identification
  20. 评分卡模型案例(一)| 基础知识

热门文章

  1. 编译和链接的区别、makefile怎么写
  2. 【C++】函数的形参
  3. leetcode - 437. 路径总和 III
  4. 基于Kmeans算法的文档聚类(包含Java代码及数据格式)
  5. 利用批处理程序和excel获取windows文件信息
  6. LZW压缩算法原理解析与实现【转载】
  7. DCIC巡游车与网约车运营特征对比分析-数据读取
  8. java kotlin lateinit_15. Kotlin 究竟该不该用 lateinit?
  9. 电脑壁纸知乎_分享更多美——你一定会喜欢的4K电脑壁纸【011】简约动漫风壁纸...
  10. vim剪切指定行_10 分钟上手 Vim,常用命令大盘点