Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 15776   Accepted: 5964

Description

Now and then you play the following game with your friend. Your friend writes down a sequence consisting of zeroes and ones. You choose a continuous subsequence (for example the subsequence from the third to the fifth digit inclusively) and ask him, whether this subsequence contains even or odd number of ones. Your friend answers your question and you can ask him about another subsequence and so on. Your task is to guess the entire sequence of numbers.

You suspect some of your friend's answers may not be correct and you want to convict him of falsehood. Thus you have decided to write a program to help you in this matter. The program will receive a series of your questions together with the answers you have received from your friend. The aim of this program is to find the first answer which is provably wrong, i.e. that there exists a sequence satisfying answers to all the previous questions, but no such sequence satisfies this answer.

Input

The first line of input contains one number, which is the length of the sequence of zeroes and ones. This length is less or equal to 1000000000. In the second line, there is one positive integer which is the number of questions asked and answers to them. The number of questions and answers is less or equal to 5000. The remaining lines specify questions and answers. Each line contains one question and the answer to this question: two integers (the position of the first and last digit in the chosen subsequence) and one word which is either `even' or `odd' (the answer, i.e. the parity of the number of ones in the chosen subsequence, where `even' means an even number of ones and `odd' means an odd number).

Output

There is only one line in output containing one integer X. Number X says that there exists a sequence of zeroes and ones satisfying first X parity conditions, but there exists none satisfying X+1 conditions. If there exists a sequence of zeroes and ones satisfying all the given conditions, then number X should be the number of all the questions asked.

Sample Input

10
5
1 2 even
3 4 odd
5 6 even
1 6 even
7 10 odd

Sample Output

3

Source

翻译:
  小A和小B玩游戏,小A写了一个长度为N的01序列,小B向小A提出许多问题,每个问题,小B指定两个数L和R,小A回答区间中有奇数个1还是偶数个1,小B发现小A可能在撒谎,向你求助,
求出一个最小的K,满足存在01序列满足1~k组询问,不满足第K加一组询问,M<=10000.
思路:
  假如我们用sum数组表示1的个数的前缀和,每次回答,
  1.l~r有偶数个1,等价于sum[l-1]与sum[r]的奇偶性相同。
  2.l~r有奇数个1, 等价于sum[l-1]与sum[r]的 奇偶性不同。
  由于序列长度很大,我们可以先离散化一下
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%s",&e[i].l, &e[i].r, s+1);
e[i].opt=(s[1]=='o'? 1 : 0);
b[++cnt]=e[i].l-1;
b[++cnt]=e[i].r;
}
sort(b+1,b+cnt+1);
int len=unique(b+1 ,b +cnt+1)-b-1;
for(int i=1;i<=len;i++)fa[i]=i; int x=lower_bound(b+1,b+len+1,e[i].l-1)-b;
int y=lower_bound(b+1,b+len+1,e[i].r)-b;

  之后:

  我们可以用边带权并查集,边权d[x]为零,表明x到fa[x]的奇偶性相同,为1则不同。在路径压缩时,对x到根的路径上的边权异或运算,即可得出x与树根的奇偶性关系。

  合并时x与y的奇偶性关系ans=d[x] xor d[y] xor d[p].

  所以 d[p] = d[x] xor d[y] xor ans

  

int find(int x)
{
if(x==fa[x])return fa[x];
int f=find(fa[x]);
d[x]^=d[fa[x]];
return fa[x]=f;
}

  代码:

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define N 10000000
using namespace std;
int d[N],b[N],n,m,cnt,tot,fa[N];
struct node
{
int l,r,opt;
}e[N<<1];
char s[10];
int find(int x)
{
if(x==fa[x])return fa[x];
int f=find(fa[x]);
d[x]^=d[fa[x]];
return fa[x]=f;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%s",&e[i].l, &e[i].r, s+1);
e[i].opt=(s[1]=='o'? 1 : 0);
b[++cnt]=e[i].l-1;
b[++cnt]=e[i].r;
}
sort(b+1,b+cnt+1);
int len=unique(b+1 ,b +cnt+1)-b-1;
for(int i=1;i<=len;i++)fa[i]=i;
for(int i=1;i<=m;i++)
{
int x=lower_bound(b+1,b+len+1,e[i].l-1)-b;
int y=lower_bound(b+1,b+len+1,e[i].r)-b;
int fx=find(x),fy=find(y);
if(fx==fy)
{
if((d[x] ^ d[y])!=e[i].opt)
{
printf("%d\n",i-1);
return 0;
}
}
else
{
fa[fx]=fy;
d[fx]=d[x]^d[y]^e[i].opt;
}
}
printf("%d\n",m);
return 0;
}

  

【poj1733】Parity game--边带权并查集的更多相关文章

  1. poj1733 Parity game[带权并查集or扩展域]

    地址 连通性判定问题.(具体参考lyd并查集专题该题的转化方法,反正我菜我没想出来).转化后就是一个经典的并查集问题了. 带权:要求两点奇偶性不同,即连边权为1,否则为0,压缩路径时不断异或,可以通过 ...

  2. P2661 信息传递[最小环+边带权并查集]

    题目来源:洛谷 题目描述 有 n 个同学(编号为 1 到 n )正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 Ti​ 的同学. 游戏 ...

  3. 【luoguP1196】 [NOI2002]银河英雄传说--边带权并查集 ,

    题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶 ...

  4. 边带权并查集 学习笔记 & 洛谷P1196 [NOI2002] 银河英雄传说 题解

    花了2h总算把边带权并查集整明白了qaq 1.边带权并查集的用途 众所周知,并查集擅长维护与可传递关系有关的信息.然而我们有时会发现并查集所维护的信息不够用,这时"边带权并查集"就 ...

  5. URAL - 1003:Parity (带权并查集&2-sat)

    Now and then you play the following game with your friend. Your friend writes down a sequence consis ...

  6. POJ1733 Party game [带权并查集or扩展域并查集]

    题目传送 Parity game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10870   Accepted: 4182 ...

  7. POJ 1773 Parity game 带权并查集

    分析:带权并查集,就是维护一堆关系 然后就是带权并查集的三步 1:首先确定权值数组,sum[i]代表父节点到子节点之间的1的个数(当然路径压缩后代表到根节点的个数) 1代表是奇数个,0代表偶数个 2: ...

  8. POJ 1733 Parity game (带权并查集)

    题意:有序列A[1..N],其元素值为0或1.有M条信息,每条信息表示区间[L,R]中1的个数为偶数或奇数个,但是可能有错误的信息.求最多满足前多少条信息. 分析:区间统计的带权并查集,只是本题中路径 ...

  9. AcWing 238.银河英雄传说 (边带权并查集)

    题意:有\(n\)列,有\(T\)条指令,若指令格式为\(M\),则将第\(i\)号的所有战舰移到第\(j\)号所在列的后面,若指令格式为\(C\),询问\(i\)和\(j\)是否在同一列,如果在,问 ...

随机推荐

  1. Do Not Try This Problem(分块思想)

    题意:https://codeforces.com/group/ikIh7rsWAl/contest/259944/problem/D 给你q个操作,4个数n,a,k,c,从n好位置开始每次加a的位置 ...

  2. 内存溢出,内存泄漏,CPU溢出区别

    内存溢出 out of memory,就是你要的内存空间超过了系统实际分配给你的空间,此时系统相当于没法满足你的需求,就会报内存溢出的错误 内存泄漏是指你向系统申请分配内存进行使用(new),可是使用 ...

  3. 用函数来编写实现strlen()函数功能

    strlen( )函数: 测试字符串实际长度的函数,它的返回值是字符串中字符的个数(不包含’\0’) //strlen( )函数:测试字符串实际长度的函数,它的返回值是字符串中字符的个数(不包含’\0 ...

  4. shell习题第17题:检测磁盘

    [题目要求] 写一个shell脚本,检测所有磁盘分区使用率和inode使用率并记录到以当天日期命名的日志文件里,当发现某个分区容量或者inode使用量大于85%时候,发邮件提醒 [核心要点] df d ...

  5. 利用ant-design封装react的地址输入组件

    在上一节利用element-ui封装地址输入的组件留下了个尾巴,说react搭配ant-design封装一下地址输入的组件的.本来应该早早就完成的,但是由于这中间发生了一些事情,导致了突发性的换了工作 ...

  6. mysql replace substring 字符串截取处理

    SELECT a1,a2,replace(a2, "豫ICP备16006180号-", "") a22,a3,a4,a5 FROM `aaab` order b ...

  7. [转载]Java序列化与反序列化

    [转载]Java序列化与反序列化 来源: https://www.cnblogs.com/anitinaj/p/9253921.html 序列化和反序列化作为Java里一个较为基础的知识点,那你能说一 ...

  8. JDK + Tomcat 安装 + 制作自定义镜像【第 3 篇 系统镜像】

    [第 1 篇 JDK]:https://www.cnblogs.com/del88/p/11842387.html[第 2 篇 Tomcat]:https://www.cnblogs.com/del8 ...

  9. C#面向对象(抽象类、接口、构造函数、重载、静态方法和静态成员)

    1.抽象类    抽象类关键词   abstract   (抽象)  override    (重写) 在父集中用   abstract 表示抽象类,抽象方法,在子集中用  override 改写 抽 ...

  10. go语言怎么从(json后的)多层map中取值

    // 一个PHP中的多层关联数组,即Go中的多层map,如何从json字符串中解析,然后取到map中的某个具体的值. // 数据结构如下: cityInfo := "{ "stat ...