题意:

一个长度为 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. (一)神经网络训练不起来怎么办:局部最小值(local minia)与鞍点(saddle point)
  2. luogu P4408 [NOI2003]逃学的小孩(树的直径)
  3. 电源两端并联一个电容的作用(
  4. 园林系统优秀党员推荐材料_昆山合纵生态科技有限公司——园林废弃物循环利用“昆山合纵模式”的探索和实践者...
  5. sqlserver大数据归档
  6. [转载]Linux基础知识之挂载详解(mount,umount及开机自动挂载)
  7. Master of GCD(差分数组||线段树)
  8. Android RecyclerView(八)设置自定义 下拉刷新 与 上拉加载数据
  9. 看完这些美食海报,你是不是又有灵感了?
  10. 我就是要用MD5!不用不行!那么,怎么防止被拖库后泄露用户密码?
  11. 产品UI原型设计软件:Balsamiq Mockups 3 for Mac
  12. NGS测序数据和Microarray芯片数据在基因表达中的应用
  13. micropython esp8266教程_ESP8266 Micropython – 连接大学Wi-Fi(WPA2 Enterprise PEAP)
  14. mysql实现俩个属性加减运算_mysql加减乘除
  15. 国产运动耳机品牌排行榜、2022运动耳机款式盘点
  16. 解决:无法访问此网站网址为 https://weread.qq.com/ 的网页可能暂时无法连接,或者它已永久性地移动到了新网址。 ERR_INSUFFICIENT_RESOURCES
  17. 图文讲解.NET CLR是什么
  18. 如何清理占用计算机内存,电脑内存占用太高怎么办?教你一招轻松解决~-怎么清理电脑内存...
  19. 使用xshell实现内网穿透与socket代理
  20. 2计算机期末考试试题,大学计算机应用基础期末考试试题及答案

热门文章

  1. Apache Prefork、Worker和Event三种工作模式分析
  2. 剑指 offer set 8 树的子结构
  3. .net程序员转战android第二篇---牛刀小试
  4. 设置dedecms为动态页面,设置dedecms为静态页面,首页动态,列表动态和文章动态
  5. python在同一行输入n个数转义符_python:转义符\
  6. ospf 指定dr_OSPF中DR、BDR竞选机制
  7. tomcat如何设置账号和密码
  8. python列表语法_python学习之列表语法
  9. 陕西师范大学远程教育学院计算机应用基础,陕西师范大学远程教育学院计算机应用基础机考备考试题.doc...
  10. 计算机硬盘坏道解决办法