题目: 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

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

Sample Output

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语言代码:

 #include <stdio.h>
#include <string.h>
#define maxn 5010
#define Mod 149993
int hash[Mod], Map[Mod], Rank[*maxn], prev[*maxn];
// Rank[i] = ? (两种情况, 要么 1~i与 1~prev[i]同奇偶性(Rank[i]=Rank[prev[i]]表示), 要么 1~i 与1~prev[i]异奇偶性) // hash一个数据x的位置
int locate(int x) {
int i = , w = x % Mod;
while (i < Mod && hash[(w+i) % Mod] != && hash[(w+i) % Mod] != x) {
i++;
}
return (w+i) % Mod;
} // 初始化
void init() {
memset(hash, , sizeof(hash));
for (int i = ; i < maxn; i++) {
Rank[i] = ;
prev[i] = i;
}
} int join(int x, int y, int judge) {
int fx = find(x);
int fy = find(y);
if (fx == fy) {
if (Rank[x] ^ Rank[y] == judge) return ; // if((Rank[x] + Rank[y]) % 2 == judge)
else return ;
}
else {
prev[fy] = fx;
Rank[fy] = (Rank[x] + Rank[y] + judge) % ;
}
return ;
} int find(int x) {
if (x != prev[x]) {
int px = find(prev[x]);
Rank[x] = Rank[x] ^ Rank[prev[x]]; // Rank[x] = (Rank[x] + Rank[prev[x]]) % 2;
prev[x] = px;
}
return prev[x];
} int main() {
int n, m, gg = , count = ;
scanf("%d%d", &n, &m);
init();
for (int i = ; i <= m; i++) {
int x, y, judge;
char str[];
scanf("%d%d%s", &x, &y, str);
x--; // x-1;
int px = locate(x), py = locate(y);
if (hash[px] != x) {
hash[px] = x;
Map[px] = count++;
}
if (hash[py] != y) {
hash[py] = y;
Map[py] = count++;
}
if (!strcmp("even", str)) {
judge = ;
}
else {
judge = ;
}
if (join(Map[px], Map[py], judge) && !gg) {
gg = i;
}
}
if (!gg) {
gg = m+;
}
printf("%d\n", gg-);
return ;
}

并查集例题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. 从0系统学Android--5.2 发送广播

    从0系统学Android--52 发送广播 本系列文章目录:更多精品文章分类 本系列持续更新中.... 初级阶段内容参考<第一行代码> 5.3 发送自定义广播 前面已经学习了如何接受广播了 ...

  2. 2653 区间xor

    前言 这个题目在我之前那篇c++位运算的的随笔中提到过. 有兴趣的话去看看吧! 飞机场:https://www.cnblogs.com/laoguantongxiegogofs/p/12444517. ...

  3. flask 模型一对多个人理解

    在modle中创建两个模型表 class User(db.Model): id = db.Column(db.Integer,primary_key=True,autoincrement=True) ...

  4. DevOps - 持续集成

    最近在担任公司部门的DevOps Champion的角色,一直觉得这个只是一个协调者的角色(而不是一个SME的角色),我的工作大概就是将每个项目的devops工具收集一下,然后用图表的形式去体现大家用 ...

  5. springboot项目中thymeleaf布局应用

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  6. 【摩天大楼平地起】基础篇 09 简述N种查找算法

    引言 在开始之前首先可以先思考一下假如没有查找算法会是什么情况?所有数据结构都需要全部遍历一遍,每次都一遍又一遍的查,从本质而言查找算法就是为了提高效率. 经过前人一代又一代的努力,目前的查找算法大致 ...

  7. 常用计算机CMD 命令

      cd\  '返回到根目录  cd..  '返回到上一级目录 1 cd 显示当前目录名或改变当前目录. 2 dir 显示目录中的文件和子目录列表.  3 md 创建一个目录.  4 mkdir  创 ...

  8. Git 的简单使用及ssh配置问题-赖大大

    软件安装 第一步当然是安装啦. 官方网址:https://git-scm.com/ 具体操作 在你本地电脑的文件夹里右击鼠标,选Git base here 显然,你是在本地仓库的master分支上,通 ...

  9. Vulnhub靶场DC-1 WP

    前言 之前提到过最近在做vlunhub的靶场复现工作,今天开始更新writeup吧.(对着walkthrough一顿乱抄嘻嘻嘻) 关于DC-1(官网翻译来的) 描述 DC-1是一个专门构建的易受攻击的 ...

  10. 大数据软件安装之ZooKeeper监控

    一.ZooKeeper安装 官方文档: https://zookeeper.apache.org/doc/r3.5.5/zookeeperStarted.html 1.解压分发 [test@hadoo ...