题意:

一个长度为 NNN 的由 000 和 111 组成的序列 SSS。MMM 个询问,返回 [l,r][l,r][l,r] 中 111 的个数是奇数还是偶数。输出一个最小的 kkk,使得存在一个 010101 序列满足第 1k−11~k-11 k−1 个回答,但不存在满足第 1k1~k1 k 个回答的 010101 序列。
(N≤109,M≤10000)(N\leq 10^9,M\leq 10000)(N≤109,M≤10000)


思路:

NNN 比较大,但是询问比较少,因此需要将所有数字离散化。

然后我们需要处理区间 [l,r][l,r][l,r] 的 111 的个数是偶数还是奇数。因此我们来定义一下 x→rootx\rightarrow rootx→root,d[x]d[x]d[x] 表示 sum[root]−sum[x]sum[root]-sum[x]sum[root]−sum[x] 的值为奇数还是偶数,即 [x+1,root][x+1,root][x+1,root] 中 111 的个数为奇数还是偶数。如果维护的是 [x,root][x,root][x,root] 的信息,那么 d[x]d[x]d[x] 初始值就不确定了,因此维护的是 [x+1,root][x+1,root][x+1,root],d[x]d[x]d[x] 初始为 000 。

所以 x→rootx\rightarrow rootx→root 为 000,表示 [x+1,root][x+1,root][x+1,root] 中 111 的个数为偶数。如果为 111,则表示 111 的个数为奇数。在合并时维护一个模 222 剩余系。

比如 [x,y][x,y][x,y] 中 111 的个数为偶数,则 (x−1)→y(x-1)\rightarrow y(x−1)→y 为 000,fa[fx]=fy,d[fx]=(x→y)−(x→fx)−(fy→y)=(0−d[x]+d[y]+2)mod2fa[fx] = fy,d[fx] = (x\rightarrow y)-(x\rightarrow fx)-(fy\rightarrow y)=(0-d[x]+d[y]+2)\ mod\ 2fa[fx]=fy,d[fx]=(x→y)−(x→fx)−(fy→y)=(0−d[x]+d[y]+2) mod 2。

查询 [x,y][x,y][x,y] 中 111 个数奇偶,直接 (d[x]−d[y]+2)mod2(d[x]-d[y]+2)\ mod \ 2(d[x]−d[y]+2) mod 2,为 000 则为偶,否则为奇。

至此即可完成本题。

ps:本题也可以维护并查集路径上节点的异或和,000 表示为偶,111 表示为奇。


代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define __ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define LOG1(x1,x2) cout << x1 << ": " << x2 << endl;
#define LOG2(x1,x2,y1,y2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << endl;
typedef long long ll;
typedef double db;
const db EPS = 1e-9;
using namespace std;
const int N = 2*1e4+100;int n,m,fa[N],d[N],a[N],tot;
struct Query{int x,y,op;
}q[N];int find(int x){if(x == fa[x]) return x;int root = find(fa[x]);d[x] = (d[x]+d[fa[x]]+2)%2;return fa[x] = root;
}int search_for(int x){return lower_bound(a+1,a+1+tot,x)-a;
}int main()
{scanf("%d%d",&n,&m); tot = 0;rep(i,1,m){scanf("%d%d",&q[i].x,&q[i].y);char oop[10]; scanf("%s",oop);if(oop[0] == 'e') q[i].op = 1; //偶数else q[i].op = 0; //奇数a[++tot] = q[i].x-1, a[++tot] = q[i].y;}sort(a+1,a+1+tot);tot = unique(a+1,a+1+tot)-a-1;rep(i,0,tot) fa[i] = i, d[i] = 0;int ans = m;rep(i,1,m){int xx = search_for(q[i].x-1), yy = search_for(q[i].y), cc = q[i].op;int fx = find(xx), fy = find(yy);if(cc){   //偶数if(fx != fy){fa[fx] = fy;d[fx] = (d[yy]-d[xx]+2)%2;}else{int jud = (d[xx]-d[yy]+2)%2;if(jud == 1){ans = i-1;break;}}}else {    //奇数if(fx != fy){fa[fx] = fy;d[fx] = (d[yy]-d[xx]+2+1)%2;}else{int jud = (d[xx]-d[yy]+2)%2;if(jud == 0){ans = i-1;break;}}}}printf("%d\n",ans);return 0;
}

【POJ 1733】Parity game【带权并查集维护奇偶】相关推荐

  1. 【uva12232/hdu3461】带权并查集维护异或值

    [uva12232/hdu3461]带权并查集维护异或值 题意: 对于n个数a[0]~a[n-1],但你不知道它们的值,通过逐步提供给你的信息,你的任务是根据这些信息回答问题: I P V :告诉你a ...

  2. POJ 1417 True Liars 带权并查集 + 背包

    一.内容 After having drifted about in a small boat for a couple of days, Akira Crusoe Maeda was finally ...

  3. POJ 1417 True Liars(带权并查集+DP)

    传送门 Description After having drifted about in a small boat for a couple of days, Akira Crusoe Maeda ...

  4. BZOJ 2303 方格染色(带权并查集)

    要使得每个2*2的矩形有奇数个红色,如果我们把红色记为1,蓝色记为0,那么我们得到了这2*2的矩形里的数字异或和为1. 对于每个方格则有a(i,j)^a(i-1,j)^a(i,j-1)^a(i-1,j ...

  5. 2020CCPC(长春) - Ragdoll(启发式合并+带权并查集)

    题目大意:初始时给出 n 个集合,每个集合中都包含有一个数字,现在要求执行 m 次操作,每次操作分为下列三种类型: 1 x y:在 x 位置新建一个集合,并且放置一个数字 y 2 x y:合并集合 x ...

  6. 2017 西安网络赛A Tree(树上静态查询,带权并查集,矩阵乘法压位,好题)

    题目链接 题意: 给出 \(n(n \leq 3000)\) 个结点的一棵树,树上每个结点有一个 \(64 \times 64\) 的 \(0,1\)矩阵,每个结点上的矩阵是根据输入的 \(seed\ ...

  7. 信息传递(带权并查集求最小环

    P2661 [NOIP2015 提高组] 信息传递 题意: nnn 个同学玩信息传递,第 iii 个同学只会将信息传递给同学 TiT_iTi​,游戏开始时每个人只知道自己的生日,一轮游戏同学 iii ...

  8. 带权并查集【bzoj3362】: [Usaco2004 Feb]Navigation Nightmare 导航噩梦

    [bzoj]3362: [Usaco2004 Feb]Navigation Nightmare 导航噩梦 ​ 农夫约翰有N(2≤N≤40000)个农场,标号1到N,M(2≤M≤40000)条的不同的垂 ...

  9. hdu3234 Exclusive-OR(带权并查集)

    题目 题目叙述来自思路来源,懒得敲了2333-- 思路来源 https://blog.csdn.net/XY20130630/article/details/50638922 题解 考虑,把Xp XO ...

  10. Gym-100923H-Por Costel and the Match(带权并查集)

    链接: https://vjudge.net/problem/Gym-100923H 题意: Oberyn Martell and Gregor Clegane are dueling in a tr ...

最新文章

  1. SHOP++ JTM使用帮助
  2. java equals() 函数_java equals()函数与‘==’
  3. 开始使用gradle
  4. CSS3 Flex布局子元素的属性
  5. 【IIS】修改注册表键值提升IIS的性能
  6. Ant Design介绍
  7. 注塑模具有哪些必须要知道的,了解一下
  8. vue3+vant Failed to resolve import “E:/code3/jianmu-user-yd/node_modules/vant/lib/vant/es/icon/style
  9. 如何优化在搜索引擎上的友好度
  10. 肺管家科普:引发肺气肿的原因竟然是这些...
  11. BT06串口蓝牙模块的配置以及与电脑的配对
  12. python bs4 之 BeautifulSoup 爬虫使用
  13. SAP HANA业务第三季度实现三位数增长
  14. matlab 运行报错:变量似乎随迭代次数而改变,请预先分配内存空间以加快运算速度 解决方式
  15. 360提示证书风险问题
  16. ARM芯片tops的计算方法
  17. awk,gawk调用shell,bash中的变量 笔记221106
  18. usb网卡在linux上能直接用吗,关于usb网卡如何在红旗linux6.0上使用的问题
  19. OPENSTACK-2-管理OSP内部通信-管理服务目录
  20. Python量化交易开源框架:AmazingQuant

热门文章

  1. Python内置函数filter(),map(),reduce(),lambda
  2. POJ 3083 Children of the Candy Corn(DFS + BFS)
  3. Mybatis mapper.xml中常用标签详解
  4. 2022年寒假ACM练习1
  5. crc可以检出奇数个错误_计算机网络学习笔记 3.3 差错控制
  6. redis value多大会影响性能_Redis 最常见面试问题
  7. linux怎么进入windows系统安装目录下,windows下Linux子系统的安装配置
  8. ixigua解析_资本运作系列课程五:《科创板申请上市估值模型理论解析》现场直播回放...
  9. python大列表_Python列表操作大全(非常全)
  10. mysql 数据库安装命令_Mysql数据库的安装