题目: http://poj.org/problem?id=1733

题意: 输入n表示有一个长度为n的0,1字符串, m表示接下来有m行输入, 接下来的m行输入中x, y, even表示第x到第y个字符中间1的个数为偶数个, x, y, odd表示第x到第y个字符中间1的个数为奇数个, 若m句话中第k+1是第一次与前面的话矛盾, 输出k;

Sample Input

  1. 10
  2. 5
  3. 1 2 even
  4. 3 4 odd
  5. 5 6 even
  6. 1 6 even
  7. 7 10 odd

Sample Output

  1. 3

解题参考https://www.cnblogs.com/geloutingyu/p/6129590.html

思路: 若x, y之间( [ x ,y ] )1的个数为偶数个,

那么1~(x-1) 与1~y 中1的个数同奇偶性, 反之则异奇偶性, 我们可以将其理解为若输入x, y, even, 即(x-1), y属于同种, 反之则属于不同种,

    种类并查集 + 离散化

注意点:

  1. x-1 与 y

  2. 数据范围:n ≤ 1e9 , 故查的时候不能直接就用数组下标。 下面用c语言代码+hash 写出, 不直接用c++的map。

以下为c语言代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #define maxn 5010
  4. #define Mod 149993
  5. int hash[Mod], Map[Mod], Rank[*maxn], prev[*maxn];
  6. // Rank[i] = ? (两种情况, 要么 1~i与 1~prev[i]同奇偶性(Rank[i]=Rank[prev[i]]表示), 要么 1~i 与1~prev[i]异奇偶性)
  7.  
  8. // hash一个数据x的位置
  9. int locate(int x) {
  10. int i = , w = x % Mod;
  11. while (i < Mod && hash[(w+i) % Mod] != && hash[(w+i) % Mod] != x) {
  12. i++;
  13. }
  14. return (w+i) % Mod;
  15. }
  16.  
  17. // 初始化
  18. void init() {
  19. memset(hash, , sizeof(hash));
  20. for (int i = ; i < maxn; i++) {
  21. Rank[i] = ;
  22. prev[i] = i;
  23. }
  24. }
  25.  
  26. int join(int x, int y, int judge) {
  27. int fx = find(x);
  28. int fy = find(y);
  29. if (fx == fy) {
  30. if (Rank[x] ^ Rank[y] == judge) return ; // if((Rank[x] + Rank[y]) % 2 == judge)
  31. else return ;
  32. }
  33. else {
  34. prev[fy] = fx;
  35. Rank[fy] = (Rank[x] + Rank[y] + judge) % ;
  36. }
  37. return ;
  38. }
  39.  
  40. int find(int x) {
  41. if (x != prev[x]) {
  42. int px = find(prev[x]);
  43. Rank[x] = Rank[x] ^ Rank[prev[x]]; // Rank[x] = (Rank[x] + Rank[prev[x]]) % 2;
  44. prev[x] = px;
  45. }
  46. return prev[x];
  47. }
  48.  
  49. int main() {
  50. int n, m, gg = , count = ;
  51. scanf("%d%d", &n, &m);
  52. init();
  53. for (int i = ; i <= m; i++) {
  54. int x, y, judge;
  55. char str[];
  56. scanf("%d%d%s", &x, &y, str);
  57. x--; // x-1;
  58. int px = locate(x), py = locate(y);
  59. if (hash[px] != x) {
  60. hash[px] = x;
  61. Map[px] = count++;
  62. }
  63. if (hash[py] != y) {
  64. hash[py] = y;
  65. Map[py] = count++;
  66. }
  67. if (!strcmp("even", str)) {
  68. judge = ;
  69. }
  70. else {
  71. judge = ;
  72. }
  73. if (join(Map[px], Map[py], judge) && !gg) {
  74. gg = i;
  75. }
  76. }
  77. if (!gg) {
  78. gg = m+;
  79. }
  80. printf("%d\n", gg-);
  81. return ;
  82. }

并查集例题01. 种类并查集(poj1733)的更多相关文章

  1. BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]

    题意: 朋友的朋友是朋友,敌人的敌人是朋友:朋友形成团伙,求最多有多少团伙 种类并查集WA了一节课,原因是,只有那两种关系才成立,诸如朋友的敌人是朋友之类的都不成立! 所以拆点做吧 #include ...

  2. POJ1417 True Liars 并查集 动态规划 (种类并查集)

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ1417 题意概括 有一群人,p1个好人,p2个坏人. 他们说了n句话.(p1+p2<=600,n ...

  3. 【进阶——种类并查集】hdu 1829 A Bug's Life (基础种类并查集)TUD Programming Contest 2005, Darmstadt, Germany

    先说说种类并查集吧. 种类并查集是并查集的一种.但是,种类并查集中的数据是分若干类的.具体属于哪一类,有多少类,都要视具体情况而定.当然属于哪一类,要再开一个数组来储存.所以,种类并查集一般有两个数组 ...

  4. 浅谈并查集&种类并查集&带权并查集

    并查集&种类并查集&带权并查集 前言: 因为是学习记录,所以知识讲解+例题推荐+练习题解都是放在一起的qvq 目录 并查集基础知识 并查集基础题目 种类并查集知识 种类并查集题目 并查 ...

  5. 洛谷 P2024 [NOI2001]食物链(种类并查集,加权并查集)

    传送门 解题思路 加权并查集: 什么是加权并查集? 就是记录着每个节点到它的父亲的信息(权值等). 难点:在路径压缩和合并节点时把本节点到父亲的权值转化为到根节点的权值 怎么转化呢? 每道题都不一样Q ...

  6. poj 1182:食物链(种类并查集,食物链问题)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44168   Accepted: 12878 Description ...

  7. C - BLG POJ - 1417 种类并查集加dp(背包)

    思路:刚看这道题感觉什么都不清楚,人物之间的关系一点也看不出来,都不知道怎么写,连并查集都没看出来,但是你可以仔细分析一下,当输入字符串为“yes”的时候,我们设输入的值为x和y,当x为天使是则由题可 ...

  8. POJ 1733 Parity game(种类并查集)

    http://poj.org/problem?id=1733 题意: 给出一个01串,有多次询问,每次回答[l,r]这个区间内1的个数的奇偶性,但是其中有一些回答是错误的,问到第几个回答时与前面的回答 ...

  9. Poj(1703),种类并查集

    题目链接:http://poj.org/problem?id=1703 已经不是第一次接触种类并查集了,直到今天才搞懂. 感谢红黑联盟,感谢杰哥!!! 每个节点只要关系确定,不管是不是同一个集合里面, ...

随机推荐

  1. 原生js中的常用方法的写法

    1.js深度克隆的方法 //第一种 function deepClone(obj){ var str,newObj = obj instanceof Array? [] : {}; if(typeof ...

  2. python学习记录_中断正在执行的代码,执行剪切板中的代码,键盘快捷键,魔术命令,输入和输出变量,记录输入和输出变量_

    2018-03-28 00:56:39 中断正在执行的代码 无论是%run执行的脚本还是长时间运行的命令ctrl + cIn [1]: KeyboardInterrupt 执行剪切板中的代码 ctrl ...

  3. 使用 Redis 如何实现查询附近的人?「视频版」——面试突击 003 期

    面试问题 Redis 如何实现查询附近的人? 涉及知识点 Redis 中如何操作位置信息? GEO 底层是如何实现的? 如何在程序实现查询附近的人? 在实际使用中需要注意哪些问题? 视频答案 视频地址 ...

  4. Yuchuan_Linux_C编程之五gdb调试

    一.整体大纲 二.gdb调试 1. 启动gdb start -- 只执行一步    n -- next    s -- step(单步) -- 可以进入到函数体内部    c - continue - ...

  5. 简单的猜数字小游戏--Python

    猜数字小游戏: #coding=utf-8 import random   answer =random.randint(1,100) #生成随机数 n=int (input("Please ...

  6. CouchDB的简单使用

    一.安装CouchDB 到官网下载CouchDB,在windows下安装CouchDB较为简单,略过. 安装完后,确认CouchDB在运行,然后在浏览器访问http://127.0.0.1:5984/ ...

  7. word文档常用的格式操作(分页、分节、每一节如何设置页码、以及生成目录)

    分页: 分节: 自动生成目录:

  8. 解决vue在控制台的 NavigationDuplicated 报错

    解决问题: 点击相同的链接,会有一个重复key的报错 const originalPush = Router.prototype.push Router.prototype.push = functi ...

  9. Java字符串转List

    List<String> result = Arrays.asList(str.split(","));

  10. SpringMVC框架——自定义数据类型转换器

    Spring MVC 框架的 Converter<S,T> 是一个可以将一种数据类型转换成另一种数据类型的接口,这里 S 表示源类型,T 表示目标类型. 开发中如果需要自定义数据类型转换时 ...