题目描述

•有一个01序列,长度<=1000000000,现在有n条信息,每条信息的形式是-a
b even/odd。表示第a位到第b位元素之间的元素总和是偶数/奇数。
•你的任务是对于这些给定的信息,输出第一个不正确的信息所在位置-1。信息的数目不超过5000。
•如果信息全部正确,即可以找到一个满足要求的01序列,那么输出n。

输入

•输入文件
•第一行一个整数m表示01序列的长度,第二行一个整数n表示信息的数目。
•接下来是n条信息

输出

输出第一条错误信息的位置-1.

如果没有错误信息,则输出n

样例输入

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

样例输出

3

这道题可以用并查集的思路做

将第三行数据的1 2看做半开半闭区间( 0 , 2 ]中的所有整数元素,他们的和是偶数,可将0当做2的父亲,他们之间的距离为0(偶数mod2的余数)

以此类推,如果为奇数,则他们之间的距离为1

那么,输入x和y,找到他们各自的父亲g和h,如果g不等于h,则无需验证,将g作为h的父亲,其距离计算公式为:

s[ h ]=( s[ x ] + m - s[ y ] )%2

其中m为x到y的和的奇偶性(看不懂就慢慢想)

如果,g等于h,则进行验证,看看abs( s[ x ] - s[ y ] )%2是否满足此语句的奇偶性

整体思路到位

接下来,由于输入的x和y最大为十亿,无法开出这么大的数组,则必须将其理想化

由于只有5000条语句,所以元素最多只有10000个,则用数组将输入的x和y装进去,要验证的时候直接数组里面找,将其在数组中的编号代替其本身进行运算

还不明白?看代码吧:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<algorithm>
  5. using namespace std;
  6. int abs(int x){return x>=0?x:-x;}
  7. int a[10001];
  8. int f[10001],s[10001];
  9. int m,n,k;
  10. int find(int x)//找父亲与离父亲的距离,顺便找沿路所有元素与离父亲的距离(看不懂?自己慢慢想)
  11. {
  12. if(f[x]==0)return x;
  13. int xx=find(f[x]);
  14. s[x]+=s[f[x]];
  15. s[x]%=2;
  16. return f[x]=xx;
  17. }
  18. int main()
  19. {
  20. int i,j;
  21. scanf("%d%d",&m,&n);
  22. for(i=1;i<=n;i++)
  23. {
  24. char c[11];
  25. int x,y,r1,r2;
  26. scanf("%d%d%s",&x,&y,c);
  27. if(x>m||y>m){printf("%d",i-1);return 0;}
  28. if(x>y)swap(x,y);
  29. x--;//半开半闭区间,小的元素减减
  30. bool p=0,q=0;
  31. for(j=1;j<=k;j++)//找数组中是否有x和y
  32. <span style="white-space:pre">  </span>{
  33. if(a[j]==x&&!p)x=j,p=1;
  34. if(a[j]==y&&!q)y=j,q=1;
  35. }
  36. if(!p)a[++k]=x,x=k;//没有就将其加进去
  37. if(!q)
  38. {
  39. if(x!=y)a[++k]=y,y=k;//这里要注意
  40. else y=x;
  41. }
  42. r1=find(x),r2=find(y);
  43. if(r1!=r2)
  44. {
  45. if(r1>r2)swap(r1,r2);
  46. f[r2]=r1;
  47. if(c[0]=='o')s[r2]=abs(s[x]+1-s[y])%2;
  48. else s[r2]=abs(s[x]-s[y])%2;
  49. }
  50. else//验证
  51. {
  52. if(c[0]=='o'&&abs(s[x]-s[y])%2!=1){printf("%d",i-1);return 0;}
  53. if(c[0]=='e'&&abs(s[x]-s[y])%2){printf("%d",i-1);return 0;}
  54. }
  55. }
  56. printf("%d",n);
  57. }

并查集——奇偶性(Parity)的更多相关文章

  1. U137971 公司搬迁 - 并查集 奇偶性

    题目描述 因为人员规模扩大,T公司准备搬到新的写字楼去,写字楼分为A座和B座,n名不同工号的员工x(p1,p2,p3...pn) 按照下面两个规则确定在A座或者B座进行办公:(1)如果工号为x的员工在 ...

  2. 【POJ1733】【带标记并查集】Parity game

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

  3. 【转】并查集&MST题集

    转自:http://blog.csdn.net/shahdza/article/details/7779230 [HDU]1213 How Many Tables 基础并查集★1272 小希的迷宫 基 ...

  4. 51nod 1204 Parity(并查集应用)

    1204 Parity 题目来源: Ural 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   你的朋友写下一串包含1和0的串让你猜,你可以从中选择一个连续的子串 ...

  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 Parity game 【带权并查集】*

    POJ1733 Parity game Description Now and then you play the following game with your friend. Your frie ...

  7. 【poj1733】Parity game--边带权并查集

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

  8. POJ 1733 Parity game(离散化+带权并查集)

    离散化+带权并查集 题意:长度为n的0和1组成的字符串,然后问第L和R位置之间有奇数个1还是偶数个1. 根据这些回答, 判断第几个是错误(和之前有矛盾)的. 思路:此题同HDU 3038 差不多,询问 ...

  9. POJ - 1733 Parity game 种类并查集+离散化

    思路:d(i, j)表示区间(i, j]的1的个数的奇偶性.输入最多共有5000*2个点,需要离散化处理一下.剩下的就是并查集判冲突. AC代码 #include <cstdio> #in ...

随机推荐

  1. linux 搭建jenkins

    一.什么是持续集成? (1)Continuous integration(CI) 持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员至少集成一次,也就意味着每天可能会发生多次集 ...

  2. 16.MindManager整理交互思路

    点住主题同时按ins键可以插入一个支节点 右键主题选择下方的排列图表 可以选择排列方式 按住主题同时ctr+v就会粘帖成一个子主题 文本也可以复制黏贴 主题内容可以直接选择拖动更改结构 选择主题框上的 ...

  3. com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1680 > 1024). You can change this value on the server by setting the max_allowed_packet' variable.

    这个错误是由于mysql的一个系统参数max_allowed_packet设置的值过小引起的 解决这个错误的方法就是修改这个参数的值, linux系统中我们在etc目录下找到my.cnf这个文件,打开 ...

  4. DOCKER学习_002:Docker的容器管理

    一 Docker的基本信息 前面已经安装了Docker,现在看一下已安装Docker的安装环境以及其他信息 1.1 系统环境 [root@docker-server3 ~]# uname -r -.e ...

  5. windows 8.0 mysql 修改root 密码

    Mysql 忘记root密码和修改root密码的解决方法(小结) 一.以下是Windows操作系统的操作步骤: 1. 关闭正在运行的MySQL服务-->net stop mysql 2. 打开D ...

  6. JavaScript 构造树形结构的一种高效算法

    引言 我们经常会碰到树形数据结构,比如组织层级.省市县或者动植物分类等等数据.下面是一个树形结构的例子: 在实际应用中,比较常见的做法是将这些信息存储为下面的结构,特别是当存在1对多的父/子节点关系时 ...

  7. 不仅仅是双11大屏—Flink应用场景介绍

    双11大屏 每年天猫双十一购物节,都会有一块巨大的实时作战大屏,展现当前的销售情况. 这种炫酷的页面背后,其实有着非常强大的技术支撑,而这种场景其实就是实时报表分析. 实时报表分析是近年来很多公司采用 ...

  8. 从零开始のcocos2dx生活(一)内存管理

    cocos中所有的对象都是继承自Ref基类,Ref的职责就是对对象进行引用计数管理 内存管理中最重要的是三个方法retain().release().autorelease() 在cocos中创建对象 ...

  9. $CF949D\ Curfew$ 二分/贪心

    正解:二分/贪心 解题报告: 传送门$QwQ$ 首先这里是二分还是蛮显然的?考虑二分那个最大值,然后先保证一个老师是合法的再看另一个老师那里是否合法就成$QwQ$. 发现不太会搞这个合不合法的所以咕了 ...

  10. 07Shell数组

    Shell 数组变量 普通数组:只能使用整数作为数组索引 关联数组:可以使用字符串作为数组索引 普通数组 定义数组 方法1: 一次赋一个值 数组名[索引]=变量值 示例 # array1[0]=pea ...