LNSYOJ201小胖的奇偶【并查集+离散化】【做题报告】
这道题是一个带权并查集
题目描述
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小胖的奇偶【并查集+离散化】【做题报告】相关推荐
- [POJ1733]Parity game(并查集 + 离散化)
传送门 题意:有一个长度已知的01串,给出[l,r]这个区间中的1是奇数个还是偶数个,给出一系列语句问前几个是正确的 思路:如果我们知道[1,2][3,4][5,6]区间的信息,我们可以求出[1,6] ...
- POJ1733,jzoj1779-Parity game(奇偶游戏)【带权并查集,离散化】
正题 POJ题目链接:http://poj.org/problem?id=1733 jzoj题目链接:https://jzoj.net/senior/#main/show/1779 题目大意 长度为l ...
- 2019ICPC(徐州) - so easy(并查集+离散化)
题目链接:点击查看 题目大意:给出一个1~n的序列,然后给出m个操作,每个操作分为下列两种情况: 1 x:让数字x不可用 2 x:查询包括x在内的右侧的第一个可用数字 题目分析:因为n给到了1e9,而 ...
- bzoj4195(并查集+离散化)
题目大意:给出n个变量互相的相等或不等关系,求这些关系是否矛盾 思路:把相等的变量加入并查集,不等的查询是否合法 eg:数据很大,离散化(然而我用的是map) #include<stdio.h& ...
- P1955-[NOI2015]程序自动分析【并查集,离散化】
正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P1955 题目大意 给出若干个关系,xi≠xj or xi=x ...
- CodeForces - 123A prime permutation(并查集,水题)
题目链接:点击查看 题目大意:给出一个字符串s,问能否通过重组其字母顺序,从而满足:若字符串下标从1开始,对于每一个质数下标,满足 题目分析:其实在纸上稍微写写画画就能看出个大概的规律,当字符串的长度 ...
- All men are brothers(并查集+思维 好题!!!)
链接:https://ac.nowcoder.com/acm/contest/889/E 来源:牛客网 Amy asks Mr. B problem E. Please help Mr. B to s ...
- 【CSU - 1004】Xi and Bo(并查集,裸题)
题干: Bo has been in Changsha for four years. However he spends most of his time staying his small dor ...
- poj 1733 ParityGame 并查集 离散化
这道题poj1733 和 hdu 3038类似,闭区间那里的原理相同. 本题的两段代码的区别只有find()函数不同 但是感觉没有区别的呀 AC: int find(int x) {if (par[x ...
最新文章
- 前端的单页面模式和多页面模式
- android本地socket正常,【报Bug】Android 本地打包 websocket 出错
- 2017 05 23 Python求1000内的完全数
- 蓝桥杯 算法训练 字符串合并
- IOS学习之多线程(3)--线程安全
- Android 逐帧动画isRunning 一直返回true的问题
- 路由器服务器账号密码,路由器上网账号密码设置的一般步骤介绍
- FPGA设计中提高工作频率及降低功耗题目合集
- 计算机windows10怎么找word,win10系统word文件丢失如何找回?win10系统word文件丢失的找回方法...
- Android开发-图片跟着鼠标移动,获取鼠标值
- 期末考试打乱考研数学复习,该怎么继续?
- 【WinHex篇】WinHex制作特定区域镜像教程
- python入门(四)小康小白
- 洛谷P1460 健康的荷斯坦奶牛
- js根据class属性获取所有标签
- 一年卖出20.4亿颗图像传感器,这家公司上市首日股价大涨145%
- 常用的几种PPT做图小技巧!
- 【心情分享】自己心中的程序员和别人眼里的程序员
- 在window系统安装虚拟linux系统以及搭建web环境教程
- 互斥锁 、 自旋锁、读写锁和RCU锁
热门文章
- linux和windows互传文件 、用户配置文件和密码配置文件 、用户与用户组管理
- GeneralList-广义表
- 关于[[NSNotificationCenter defaultCenter] addObserver不remove后续又收到通知crash问题
- #!(sha-bang)--脚本的开始
- HTC 败诉对 Android 意味着什么?
- 三个范式的定义与理解
- 报错:'mysql' 不是内部或外部命令,也不是可运行的程序或批处理文件。
- Ubuntu 14 查看 docker中对应容器的 IP
- 我的Go语言学习之旅二:入门初体验 Hello World
- 单例模式之懒汉式/饿汉式/结合二者之优的模式