这道题是一个带权并查集

题目描述

   huyichen和xuzhenyi在玩一个游戏:他写一个由0和1组成的序列。 huyichen选其中的一段(比如第3位到第5位),问他这段里面有奇数个1 还是偶数个1。xuzhenyi回答你的问题,然后huyichen继续问。 xuzhenyi有可能在撒谎。huyichen要检查xuzhenyi的答案,指出在xuzhenyi的第几个回答一定有问题。 有问题的意思就是存在一个01序列满足这个回答前的所有回答,而且不存在序列 满足这个回答前的所有回答及这个回答。

输入格式

第1行一个整数,是这个01序列的长度(≤1000000000)(≤1000000000) 第2行一个整数,是问题和答案的个数(≤5000)(≤5000)。 第3行开始是问题和答案, 每行先有两个整数,表示你询问的段的开始位置和结束位置。 然后是xuzhenyi的回答。odd表示有奇数个1,even表示有偶数个

输出格式

输出一行,一个数X,表示存在一个01序列满足第1到第X个回答, 但是不存在序列满足第1到第X+1个回答。如果所有回答都没问题,你就输出 所有回答的个数。

样例一

input

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

output

3

限制与约定

时间限制:1s

空间限制:256MB

思路还是比较好想的,0代表偶数个,1代表奇数个

本题关键是理解

l r even 等价于0-l-1与0-R的序列奇偶性相同。odd等价于奇偶性相反

合并方式和食物链,关押罪犯很像;

这道题有一个很重要的东西是离散化

网上的代码是

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=1e5+7;
 6 int t[N],a[N],n,m;
 7 int main()
 8 {
 9     cin>>n;
10     for(int i=1;i<=n;i++)
11         cin>>a[i],t[i]=a[i];
12     sort(t+1,t+n+1);
13     m=unique(t+1,t+n+1)-t-1;
14     for(int i=1;i<=n;i++)
15     a[i]=lower_bound(t+1,t+m+1,a[i])-t;
16     for(int i=1;i<=n;i++)cout<<a[i]<<" ";
17 }

这个一定要记住!!(unique是去重函数)

还有一种就是用结构体,也是我这道题用的,先记录一个数据的位置,排完序之后再将它是第几大赋回去;

针对具体情况还要进行改动,比如本题进行了题号的记录和排序,要灵活处理!

注意:

1.要用l-1来查询和修改,网上有读的时候就- -的,也可以

2.用结构体离散化,要注意相同数的处理(见35-41行)

3.最后记得要输出最后一个号码,我就是忘了,导致了好多个EOF

AC代码在此

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 struct node{
 5     int data,no,op,hs;
 6 }nd[5100*2];//0:l,1:r;
 7 int n,k,f[5100*2],val[5100*2];
 8 char opt[5100][51];
 9 int find(int x)
10 {
11     if(f[x]==x)return x;
12     int ff=find(f[x]);
13     val[x]=(val[x]+val[f[x]])%2;
14     return f[x]=ff;
15 }
16 bool cmp1(node a,node b)
17     {return a.data<b.data;}
18 bool cmp2(node a,node b)
19     {return a.no<b.no;}
20 int main()
21 {
22     scanf("%d%d",&n,&k);
23     for(int i=1;i<=k;i++)
24     {
25         scanf("%d",&nd[i].data);
26         nd[i].no=i;
27         nd[i].op=0;
28         nd[i].data;
29         scanf("%d",&nd[i+k].data);
30         nd[i+k].no=i;
31         nd[i+k].op=1;
32         scanf("%s",opt[i]);
33     }
34     sort(nd+1,nd+2*k+1,cmp1);
35     int tt=0;
36     for(int i=1;i<=2*k;i++)
37     {
38         if(nd[i].data==nd[i-1].data)nd[i].hs=tt;
39         else nd[i].hs=++tt;
40         f[tt]=tt;
41     }
42     sort(nd+1,nd+2*k+1,cmp2);
43     int cnt=0;
44     for(int i=1;i<=2*k;i+=2)
45     {
46         cnt++;
47         int l,r;
48         for(int j=i;j<=i+1;j++)
49         {
50             if(nd[j].op==1)r=nd[j].hs;
51             else l=nd[j].hs;
52         }
53         int fx=find(l-1),fy=find(r);
54         if(opt[cnt][0]=='e')
55         {
56             if(fx!=fy)
57             {
58                 val[fy]=(val[l-1]+val[r])%2;
59                 f[fy]=fx;
60             }else
61             {
62                 if(val[l-1]!=val[r])
63                 {
64                     printf("%d",nd[i].no-1);
65                     return 0;
66                 }
67             }
68         }else if(opt[cnt][0]=='o')
69         {
70             if(fx!=fy)
71             {
72                 val[fy]=(val[l-1]+val[r]+1)%2;
73                 f[fy]=fx;
74             }else
75             {
76                 if(val[l-1]==val[r])
77                 {
78                     printf("%d",nd[i].no-1);
79                     return 0;
80                 }
81             }
82         }
83     }
84     printf("%d",k);
85     return 0;
86 }

By 浅夜_MISAKI

转载于:https://www.cnblogs.com/Qin-Wei-Kai/p/10050604.html

LNSYOJ201小胖的奇偶【并查集+离散化】【做题报告】相关推荐

  1. [POJ1733]Parity game(并查集 + 离散化)

    传送门 题意:有一个长度已知的01串,给出[l,r]这个区间中的1是奇数个还是偶数个,给出一系列语句问前几个是正确的 思路:如果我们知道[1,2][3,4][5,6]区间的信息,我们可以求出[1,6] ...

  2. POJ1733,jzoj1779-Parity game(奇偶游戏)【带权并查集,离散化】

    正题 POJ题目链接:http://poj.org/problem?id=1733 jzoj题目链接:https://jzoj.net/senior/#main/show/1779 题目大意 长度为l ...

  3. 2019ICPC(徐州) - so easy(并查集+离散化)

    题目链接:点击查看 题目大意:给出一个1~n的序列,然后给出m个操作,每个操作分为下列两种情况: 1 x:让数字x不可用 2 x:查询包括x在内的右侧的第一个可用数字 题目分析:因为n给到了1e9,而 ...

  4. bzoj4195(并查集+离散化)

    题目大意:给出n个变量互相的相等或不等关系,求这些关系是否矛盾 思路:把相等的变量加入并查集,不等的查询是否合法 eg:数据很大,离散化(然而我用的是map) #include<stdio.h& ...

  5. P1955-[NOI2015]程序自动分析【并查集,离散化】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P1955 题目大意 给出若干个关系,xi≠xj   or   xi=x ...

  6. CodeForces - 123A prime permutation(并查集,水题)

    题目链接:点击查看 题目大意:给出一个字符串s,问能否通过重组其字母顺序,从而满足:若字符串下标从1开始,对于每一个质数下标,满足 题目分析:其实在纸上稍微写写画画就能看出个大概的规律,当字符串的长度 ...

  7. All men are brothers(并查集+思维 好题!!!)

    链接:https://ac.nowcoder.com/acm/contest/889/E 来源:牛客网 Amy asks Mr. B problem E. Please help Mr. B to s ...

  8. 【CSU - 1004】Xi and Bo(并查集,裸题)

    题干: Bo has been in Changsha for four years. However he spends most of his time staying his small dor ...

  9. poj 1733 ParityGame 并查集 离散化

    这道题poj1733 和 hdu 3038类似,闭区间那里的原理相同. 本题的两段代码的区别只有find()函数不同 但是感觉没有区别的呀 AC: int find(int x) {if (par[x ...

最新文章

  1. 前端的单页面模式和多页面模式
  2. android本地socket正常,【报Bug】Android 本地打包 websocket 出错
  3. 2017 05 23 Python求1000内的完全数
  4. 蓝桥杯 算法训练 字符串合并
  5. IOS学习之多线程(3)--线程安全
  6. Android 逐帧动画isRunning 一直返回true的问题
  7. 路由器服务器账号密码,路由器上网账号密码设置的一般步骤介绍
  8. FPGA设计中提高工作频率及降低功耗题目合集
  9. 计算机windows10怎么找word,win10系统word文件丢失如何找回?win10系统word文件丢失的找回方法...
  10. Android开发-图片跟着鼠标移动,获取鼠标值
  11. 期末考试打乱考研数学复习,该怎么继续?
  12. 【WinHex篇】WinHex制作特定区域镜像教程
  13. python入门(四)小康小白
  14. 洛谷P1460 健康的荷斯坦奶牛
  15. js根据class属性获取所有标签
  16. 一年卖出20.4亿颗图像传感器,这家公司上市首日股价大涨145%
  17. 常用的几种PPT做图小技巧!
  18. 【心情分享】自己心中的程序员和别人眼里的程序员
  19. 在window系统安装虚拟linux系统以及搭建web环境教程
  20. 互斥锁 、 自旋锁、读写锁和RCU锁

热门文章

  1. linux和windows互传文件 、用户配置文件和密码配置文件 、用户与用户组管理
  2. GeneralList-广义表
  3. 关于[[NSNotificationCenter defaultCenter] addObserver不remove后续又收到通知crash问题
  4. #!(sha-bang)--脚本的开始
  5. HTC 败诉对 Android 意味着什么?
  6. 三个范式的定义与理解
  7. 报错:'mysql' 不是内部或外部命令,也不是可运行的程序或批处理文件。
  8. Ubuntu 14 查看 docker中对应容器的 IP
  9. 我的Go语言学习之旅二:入门初体验 Hello World
  10. 单例模式之懒汉式/饿汉式/结合二者之优的模式