并查集例题01. 种类并查集(poj1733)
题目: 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)的更多相关文章
- BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]
题意: 朋友的朋友是朋友,敌人的敌人是朋友:朋友形成团伙,求最多有多少团伙 种类并查集WA了一节课,原因是,只有那两种关系才成立,诸如朋友的敌人是朋友之类的都不成立! 所以拆点做吧 #include ...
- POJ1417 True Liars 并查集 动态规划 (种类并查集)
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ1417 题意概括 有一群人,p1个好人,p2个坏人. 他们说了n句话.(p1+p2<=600,n ...
- 【进阶——种类并查集】hdu 1829 A Bug's Life (基础种类并查集)TUD Programming Contest 2005, Darmstadt, Germany
先说说种类并查集吧. 种类并查集是并查集的一种.但是,种类并查集中的数据是分若干类的.具体属于哪一类,有多少类,都要视具体情况而定.当然属于哪一类,要再开一个数组来储存.所以,种类并查集一般有两个数组 ...
- 浅谈并查集&种类并查集&带权并查集
并查集&种类并查集&带权并查集 前言: 因为是学习记录,所以知识讲解+例题推荐+练习题解都是放在一起的qvq 目录 并查集基础知识 并查集基础题目 种类并查集知识 种类并查集题目 并查 ...
- 洛谷 P2024 [NOI2001]食物链(种类并查集,加权并查集)
传送门 解题思路 加权并查集: 什么是加权并查集? 就是记录着每个节点到它的父亲的信息(权值等). 难点:在路径压缩和合并节点时把本节点到父亲的权值转化为到根节点的权值 怎么转化呢? 每道题都不一样Q ...
- poj 1182:食物链(种类并查集,食物链问题)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44168 Accepted: 12878 Description ...
- C - BLG POJ - 1417 种类并查集加dp(背包)
思路:刚看这道题感觉什么都不清楚,人物之间的关系一点也看不出来,都不知道怎么写,连并查集都没看出来,但是你可以仔细分析一下,当输入字符串为“yes”的时候,我们设输入的值为x和y,当x为天使是则由题可 ...
- POJ 1733 Parity game(种类并查集)
http://poj.org/problem?id=1733 题意: 给出一个01串,有多次询问,每次回答[l,r]这个区间内1的个数的奇偶性,但是其中有一些回答是错误的,问到第几个回答时与前面的回答 ...
- Poj(1703),种类并查集
题目链接:http://poj.org/problem?id=1703 已经不是第一次接触种类并查集了,直到今天才搞懂. 感谢红黑联盟,感谢杰哥!!! 每个节点只要关系确定,不管是不是同一个集合里面, ...
随机推荐
- 【MySQL 原理分析】之 Explain & Trace 深入分析全模糊查询走索引的原理
一.背景 今天,交流群有一位同学提出了一个问题.看下图: 之后,这位同学确实也发了一个全模糊查询走索引的例子: 到这我们可以发现,这两个sql最大的区别是:一个是查询全字段(select *),而一个 ...
- 编码的来源于格式简介ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE
编码一直是让新手头疼的问题,特别是 GBK.GB2312.UTF-8 这三个比较常见的网页编码的区别,更是让许多新手晕头转向,怎么解释也解释不清楚.但是编码又是那么重要,特别在网页这一块.如果你打出来 ...
- python从数据库取数据后写入excel 使用pandas.ExcelWriter设置单元格格式
用python从数据库中取到数据后,写入excel中做成自动报表,ExcelWrite默认的格式一般来说都比较丑,但workbook提供可以设置自定义格式,简单记录个demo,供初次使用者参考. 一. ...
- 对时间进行操作 加减 XXX天
date:要操作的时间目标 days: 要加减的天数时间 addDate: function(date, days) { if (date == '') { return '' }; if (days ...
- Spring Boot 结合 Redis 序列化配置的一些问题
前言 最近在学习Spring Boot结合Redis时看了一些网上的教程,发现这些教程要么比较老,要么不知道从哪抄得,运行起来有问题.这里分享一下我最新学到的写法 默认情况下,Spring 为我们提供 ...
- 「CSS」常见的清除浮动方法
下面介绍几种清除浮动的方案,供大家参考: 使用额外的标签clear:both .parent {padding: 10px;width: 200px;background: red;} .child ...
- (转)windows宿主机,ubuntu虚拟机下的上网设置(有线网络和无线网络)
转自:http://hi.baidu.com/puppywst/item/d9f73734856e2af32684f4e3 虚拟机下ubuntu共享方式上网: 有线网络 在有线网络的条件下,vmwar ...
- iview的input框校验添加v-modal.number会影响校验,还是依照API使用number来转换number类型
公司项目使用了iview2.0版本的,有一个需求是需要把里面的值换成number类型并且校验,代码大致如下,使用了v-modal.number来实现转换, <FormItem label=&qu ...
- git命令,github网站以及sourceTree用法详解
1.git下载安装 这里只是windows安装方法: 进入这个网址:http://msysgit.github.com/,点击下载,就会下载下来一个exe文件,双击打开,安装即可 完成安装之后,就可以 ...
- .NET 5 Preview 1的深度解读和跟进
这几天微软.NET 团队发布了.NET 5 Preview-1, 如约而至.很兴奋,因为.NET Core和.NET Framework终于实现了大一统,同时也很期待,期待.NET 5能给我们带来哪些 ...