你的朋友写下一串包含1和0的串让你猜,你可以从中选择一个连续的子串(例如其中的第3到第5个数字)问他,该子串中包含了奇数个还是偶数个1,他会回答你的问题,然后你可以继续提问......你怀疑朋友的答案可能有错,或说同他之前的答案相互矛盾,例如:1 - 2 奇数,3 - 4 奇数,那么可以确定1 - 4 一定是偶数,如果你的朋友回答是奇数,就产生了矛盾。给出所有你朋友的答案,请你找出第一个出现矛盾的答案。

Input

第1行:2个数N, Q,N为串的长度,Q为询问的数量。(2 <= N <= 100000, 2 <= Q <= 50000) 
第2 - Q + 1行:每行包括两个数以及一个字符串来描述朋友的回答,2个数中间用空格分隔,分别表示区间的起点和终点,后面的字符为"even"或"odd",表示朋友的答案。

Output

输出1个数,表示朋友的答案中第一个错误答案的位置,如果所有答案均不矛盾,则输出-1。

Sample Input

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

Sample Output

4

题意:两个人在玩游戏,其中A有一个0,1组成的序列,B任意指定一个有效区间,A回答B指定区间中1的个数的奇偶性。A可能会说谎,求A在哪一次说谎了。

思路:这道题和 How Many Answers Are Wrong 很像,只是一个简单的变形,利用并查集来记录每个端点的最左端以及合并区间。每个区间内1的个数的奇偶性是知道,那么不妨令奇数的时候只有1个1,偶数的时候有2个。我们可以用g[i]记录此时的i能达到最左的区间内1的个数。并查集每次更新集合的时候,同时也要维护g[i]。如果遇到环的时候,只需要判断以前这个区间的1的个数(g[b]-g[a])的奇偶性与此时给的1的个数(num)的奇偶性是否相同,不同的话此时这个区间肯定是与以前某些条件矛盾的,输出其索引即可。

图示:

代码如下:

#include<cstdio>
#include<cstring>
#define N 100010
int f[N],g[N];
int getf(int x)
{if(f[x]==-1)  //找到祖宗了return x;int t=getf(f[x]);  //继续向下找g[x]+=g[f[x]];  //维护 g[x],因为x肯定大于等于f[x],因此要累加f[x]=t;   //回溯赋值return t;
}
int main()
{int n,m;while(~scanf("%d%d",&n,&m)){memset(f,-1,sizeof(f));  //并查集初始化memset(g,0,sizeof(g));  // 初始化为0char str[20];int a,b,flag=-1;for(int i=1;i<=m;i++){scanf("%d%d %s",&a,&b,str);//输入区间  以及奇偶性if(flag!=-1)  //已经得到结果了continue;a--;      //因为区间[a,b],因此是求前a-1项,1的个数int num;if(str[0]=='e')//偶数num=2;else        //奇数num=1;int t1=getf(a);int t2=getf(b);if(t1!=t2)      //两个祖先不同{f[t2]=t1;   //把b的祖先归为ag[t2]=g[a]-g[b]+num;  //上图所示}else if((g[b]-g[a])%2!=(num%2)) //找到环了,区间已经重复,{flag=i;//如果区间内的值的奇偶性与num的奇偶性不同,说明已经出现矛盾了}}printf("%d\n",flag);}
}

Parity(带权值的并查集)相关推荐

  1. 数据结构几种常见图的邻接矩阵的画法(有向图带权值,有向图不带权值,无向图带权值,无向图不带权值)

    这不马上要期末考试了,复习的时候突然发现了有好几种图的邻接矩阵需要画,在网上找了半天结果发现也没有特别详细的总结,所以经过总结写一下吧,希望对有需要的人,有点帮助吧!!!!(如有不对还请见谅!!!!! ...

  2. 带权值的斐波那契数列函数的曲线形态

    带权值的斐波那契数列函数 f ( n ) = a ∗ f ( n − 1 ) + b ∗ f ( n − 2 ) f(n) = a*f(n-1) + b*f(n-2) f(n)=a∗f(n−1)+b∗ ...

  3. poj1182(加权值的并查集)

    Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A.  现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它 ...

  4. POJ-2400 Supervisor, Supervisee 带权值匹配+枚举所有匹配情况

    题意:给定两个关系矩阵,分别表示雇主和雇员的相互好感度,好感度为1最优,N最差.如果一个人与好感度为P的人匹配的话,差值为P-1,现在要求是的总共的差值最小的匹配方法,并且输出所有的匹配方案. 解法: ...

  5. hashmap储存有向图_以邻接表的形式创建带权值的有向图即有向网

    1.有向网的数据结构 单链表中的每个结点有3个域组成,分别为邻接点域(adjvex)表示与某顶点邻接的点在图中的位置:链域(nextarc)表示下一条边或弧的结点:数据域info存储和边或弧相关的信息 ...

  6. 【原创】并查集之扩展域与边带权

    [前言] 并查集是一种可以动态维护若干个不重叠的集合,并支持合并于查询的数据结构. 并查集的基本概念很简单,但是这样一种思想的用途十分广泛. 个人理解:这是一种很巧妙的,可以很好的处理对象之间关系的数 ...

  7. 数据结构进阶之并查集

    1.初探并查集 例题1:AcWing 237.程序自动分析 这题的思路其实比较好想,只要先考虑所有等于的情况并合并,然后再看不等于的情况,看是否出现矛盾即可.但是这题显然是需要离散化的,但是离散化也很 ...

  8. RQNOJ36 数石子 并查集 简单应用

    题目描述 佳佳是个贪玩的孩子.一天,他正在跟凡凡玩"数石子"的游戏.佳佳在地上摆了N堆石子,其中第I堆石子有Ai个石头.佳佳每次都会问凡凡:"凡凡,请问从第I堆到第J堆, ...

  9. 家谱树 (并查集拓扑排序)

    目录 拓扑排序 Kahn. 最后附上Kahn的代码: 链式前向星做法: 其次是我用Kahn做的家谱树的代码(矩阵): 其次是我用Kahn做的家谱树的代码(链式前向星): [题目描述] 有个人的家族很大 ...

最新文章

  1. Gitlab Issue Tracker and Wiki(一)
  2. 关于string的成员函数substr
  3. 批量正则替换某文件夹中代码(div id=XXXX替换为div id=XXXX)
  4. OpenGL灰色滤镜
  5. Android 10分钟集成极光推送
  6. NGUI使用教程(2) 使用NGUI创建2D场景而且加入标签和button
  7. 物联网卡会锁卡吗_物联网卡在建筑行业中的应用你知道吗?
  8. 【SpringCloud】Spring cloud Stream
  9. 女人要的安全感到的是什么?
  10. 认识协程gevent
  11. 《软件需求模式》05
  12. scrot usage
  13. 16. Window close() 方法
  14. Microsoft Expression blend 3 新功能简介
  15. 如何破解终端算力困局?PRCV这篇论文让机器人“算有余力”
  16. 移动SI:如何开拓企业客户市场?
  17. python必背的英语单词怎么写_背英语单词的最好方法
  18. 设计模式1(策略模式)
  19. PMSG类型究竟是什么意思?
  20. 苹果xr十大隐藏功能_苹果手机隐藏的功能

热门文章

  1. 使用CefSharp动态爬取天天基金网历史基金数据——数据存储(二)
  2. 智慧门禁APP软件开发市场现状浅析!
  3. c语言筛选奇数怎么表示,在excel表格中,有列数据1至100,如何筛选奇数或偶数?-excel怎么筛选奇数,excel按奇偶数筛选...
  4. 微信小程序图片宽度100%,高度自适应
  5. Python黑技术:远程控制男朋友电脑
  6. c#OpenCVSharp+Zxing识别条形码
  7. JAVA生成带图标的二维码(产品溯源码)
  8. thinkphp网站提示缓存文件写入失败
  9. 学校关于扩建计算机房的请示,申请装配机房的请示(模版)
  10. 流媒体客户端的结构与原理浅析