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

相关文章

随想录 Day 69 并查集 107. 寻找存在的路径

随想录 Day 69 并查集 107. 寻找存在的路径 理论基础 int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好vector<int> father = vector<int> (n, 0); // C++里的一种数组结构// 并查集初始化void init() {for (int i = 0; i < n; ++i) {father[i] = i;}

iptables(7)扩展模块state

简介         前面文章我们已经介绍了一些扩展模块,如iprange、string、time、connlimit、limit,还有扩展匹配条件如--tcp-flags、icmp。这篇文章我们介绍state扩展模块  state          在 iptables 的上下文中,--state 选项并不是直接关联于一个扩展模块,而是与 iptables 的 state 匹配机制相关,特

高仿精仿愤怒的小鸟android版游戏源码

这是一款很完美的高仿精仿愤怒的小鸟android版游戏源码,大家可以研究一下吧、 为了报复偷走鸟蛋的肥猪们,鸟儿以自己的身体为武器,仿佛炮弹一样去攻击肥猪们的堡垒。游戏是十分卡通的2D画面,看着愤怒的红色小鸟,奋不顾身的往绿色的肥猪的堡垒砸去,那种奇妙的感觉还真是令人感到很欢乐。而游戏的配乐同样充满了欢乐的感觉,轻松的节奏,欢快的风格。 源码下载

剑指offer(C++)--孩子们的游戏(圆圈中最后剩下的数)

题目 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去

【服务器08】之【游戏框架】之【加载主角】

首先简单了解一下帧率 FixedUpdate( )   >   Update( )   >   LateUpdate( ) 首先FixedUpdate的设置值 默认一秒运行50次 虽然默认是0.02秒,但FiexedUpdate并不是真的0.02秒调用一次,因为在脚本的生命周期内,FixedUpdate有一个小循环,这个循环也是通过物理时间累计看是不是大于0.02了,然后调用一次。有

2024年6月24日-6月30日(ue独立游戏为核心)

试过重点放在独立游戏上,有个indienova独立游戏团队是全职的,由于他们干了几个月,节奏暂时跟不上,紧张焦虑了。五一时也有点自暴自弃了,实在没必要,按照自己的节奏走即可。精力和时间也有限,放在周末进行即可。除非哪天失业了,再也找不到工作了,再把重心放在独立游戏上。 另外,找到一个同样业余的美术,从头做肉鸽游戏,两周一次正式交流即可。节奏一定要放慢,不能影响正常工作生活。如果影响到了,还不如自

植物大战僵尸杂交版2.1版本终于来啦!游戏完全免费

在这个喧嚣的城市里,我找到了一片神奇的绿色世界——植物大战僵尸杂交版。它不仅是一款游戏,更像是一扇打开自然奥秘的窗户,让我重新认识了植物和自然的力量。 植物大战僵尸杂交版最新绿色版下载链接: https://pan.quark.cn/s/d60ed6e4791c 🌱 🔥 激情介绍:不只是游戏,更是生态课 植物大战僵尸杂交版将经典的策略塔防游戏带入了一个全新的维度。这里,每一种植物都拥

A bug‘s life 虫子的生活(带权并查集)

题目链接: 2492 -- A Bug's Life (poj.org) 题目描述: 思路: 带权并查集,处理方法基本与食物链(http://t.csdnimg.cn/fSnRr)相同,没什么思维创新 但是一开始WA了几次,有些细节没有注意好,还是需要静下心来,好好分析问题,需要警惕! 参考代码: //#include<bits/stdc++.h>#include<iostream

游戏高度可配置化(一)通用数据引擎(data-e)及其在模块化游戏开发中的应用构想图解

游戏高度可配置化(一)通用数据引擎(data-e)及其在模块化游戏开发中的应用构想图解 码客 卢益贵 ygluu 关键词:游戏策划 可配置化 模块化配置 数据引擎 条件系统 红点系统 一、前言 在插件式模块化软件开发当中,既要模块高度独立(解耦)又要共享模块数据,最好的方法是有个中间平台(中间件)提供标准的接口来进行数据的交换,这在很多行业软件开发中已经广泛应用。但是,由于中间件的抽象和封

leetcode刷题(43)——239. 滑动窗口最大值

给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值------------