AcWing 239. 奇偶游戏(带权并查集,扩展域并查集)

2024-04-16 00:48

本文主要是介绍AcWing 239. 奇偶游戏(带权并查集,扩展域并查集),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

小A和小B在玩一个游戏。

首先,小A写了一个由0和1组成的序列S,长度为N。

然后,小B向小A提出了M个问题。

在每个问题中,小B指定两个数 l 和 r,小A回答 S[l~r] 中有奇数个1还是偶数个1。

机智的小B发现小A有可能在撒谎。

例如,小A曾经回答过 S[1~3] 中有奇数个1, S[4~6] 中有偶数个1,现在又回答 S[1~6] 中有偶数个1,显然这是自相矛盾的。

请你帮助小B检查这M个答案,并指出在至少多少个回答之后可以确定小A一定在撒谎。

即求出一个最小的k,使得01序列S满足第1k个回答,但不满足第1k+1个回答。

输入格式
第一行包含一个整数N,表示01序列长度。

第二行包含一个整数M,表示问题数量。

接下来M行,每行包含一组问答:两个整数l和r,以及回答“even”或“odd”,用以描述S[l~r] 中有偶数个1还是奇数个1。

输出格式
输出一个整数k,表示01序列满足第1k个回答,但不满足第1k+1个回答,如果01序列满足所有回答,则输出问题总数量。

数据范围
N≤109,M≤10000
输入样例:
10
5
1 2 even
3 4 odd
5 6 even
1 6 even
7 10 odd
输出样例:
3

边带权并查集好像忘得差不多了,赶紧复习一下

思路:
如果区间 [ l , r ] [l,r] [l,r]为奇数,代表 s u m [ l − 1 ] sum[l-1] sum[l1] s u m [ r ] sum[r] sum[r]的奇偶性不同,否则奇偶性相同。我们以此建立关系。

定义 d [ i ] d[i] d[i]代表 i i i与根节点的奇偶关系,如果为1代表奇偶性不同,否则奇偶性相同。关系传递直接通过关系相加再模2(因为相同奇偶性加上不改变,不同奇偶性加上改变)。

#include <ctime>
#include <iostream>
#include <assert.h>
#include <vector>
#include <queue>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <set>
#include <map>using namespace std;
const int maxn = 2e5 + 7;
const int mod = 10007;int b[maxn],cnt;
int fa[maxn],d[maxn];
int n,m;struct Query {int l,r;int kind; //1代表奇数,0代表偶数
}q[maxn];int Find(int x) {return lower_bound(b + 1,b + 1 + cnt,x) - b;
}void Input() {scanf("%d%d",&n,&m);for(int i = 1;i <= m;i++) {char op[10];scanf("%d%d%s",&q[i].l,&q[i].r,op);if(op[0] == 'o') q[i].kind = 1;else q[i].kind = 0;b[++cnt] = q[i].l - 1;b[++cnt] = q[i].r;}sort(b + 1,b + 1 + cnt);cnt = unique(b + 1,b + 1 + cnt) - (b + 1);
}int findset(int x) {if(x == fa[x]) return x;int rt = findset(fa[x]);d[x] = (d[x] + d[fa[x]]) % 2;return fa[x] = rt;
}void Solve() {for(int i = 1;i <= cnt;i++) {fa[i] = i;}for(int i = 1;i <= m;i++) {int x = Find(q[i].l - 1),y = Find(q[i].r);int rx = findset(x),ry = findset(y);if(rx != ry) {fa[rx] = ry;d[rx] = (d[x] + d[y] + q[i].kind) % 2;} else {if((d[x] + d[y]) % 2 != q[i].kind) {printf("%d\n",i - 1);return ;}}}printf("%d\n",m);
}int main() {Input();Solve();return 0;
}

扩展域并查集:
定义x域为偶数域(或者是奇偶性相同),x+n域为奇数域(或者是奇偶性不同)
那么相同奇偶性的两个集和,奇偶性相同,所以偶数域和奇数域分别合并。
奇偶性不同的两个集和,就是偶数域合并另一个数的奇数域,奇数域合并另一个数的偶数域。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;const int maxn = 3e5 + 7;int fa[maxn];
int n,m,cnt;
int b[maxn];struct Query {int l,r;int kind;
}q[maxn];int Find(int x) {return lower_bound(b + 1,b + 1 + cnt,x) - b;
}int findset(int x) {if(x == fa[x]) return x;return fa[x] = findset(fa[x]);
}void Union(int x,int y) {int rx = findset(x),ry = findset(y);if(rx != ry) fa[rx] = ry;
}void Input() {scanf("%d%d",&n,&m);for(int i = 1;i <= m;i++) {char op[10];scanf("%d%d%s",&q[i].l,&q[i].r,op);b[++cnt] = q[i].l - 1;b[++cnt] = q[i].r;if(op[0] == 'o') q[i].kind = 1;else q[i].kind = 0;}sort(b + 1,b + 1 + cnt);cnt = unique(b + 1,b + 1 + cnt) - (b + 1);
}void Solve() {for(int i = 1;i <= 2 * cnt;i++) fa[i] = i;for(int i = 1;i <= m;i++) {int x = Find(q[i].l - 1),y = Find(q[i].r);if(q[i].kind == 0) {if(findset(x) == findset(y + cnt)) {printf("%d\n",i - 1);return;}Union(x,y);Union(x + cnt,y + cnt);}else {if(findset(x) == findset(y)) {printf("%d\n",i - 1);return;}Union(x,y + cnt);Union(x + cnt,y);}}printf("%d\n",m);
}int main() {Input();Solve();return 0;
}

这篇关于AcWing 239. 奇偶游戏(带权并查集,扩展域并查集)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/907377

相关文章

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Java常用注解扩展对比举例详解

《Java常用注解扩展对比举例详解》:本文主要介绍Java常用注解扩展对比的相关资料,提供了丰富的代码示例,并总结了最佳实践建议,帮助开发者更好地理解和应用这些注解,需要的朋友可以参考下... 目录一、@Controller 与 @RestController 对比二、使用 @Data 与 不使用 @Dat

Spring组件初始化扩展点BeanPostProcessor的作用详解

《Spring组件初始化扩展点BeanPostProcessor的作用详解》本文通过实战案例和常见应用场景详细介绍了BeanPostProcessor的使用,并强调了其在Spring扩展中的重要性,感... 目录一、概述二、BeanPostProcessor的作用三、核心方法解析1、postProcessB

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

poj 1182 并查集 食物链类

题意: 有n只动物,分别编号1....n。所有动物都属于A,B,C中的一种,已知A吃B,B吃C,C吃A。 按顺序给出下面两种共K条信息: 1. x 和 y 属于同一类。 2. x 吃 y 。 然而这些信息可能会出错,有可能有的信息和之前给出的信息矛盾,也有的信息可能给出的 x 和 y 不在n的范围内。 求k条信息中有多少条是不正确的。 解析: 对于每只动物,创建3个元素 i