小胖的奇遇——论玄学

小胖的奇偶

题目描述:

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

输入格式:

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

输出格式:

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

样例输入:

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

样例输出:

3

时间限制:1000ms
空间限制:128MByte

这个题目简单来说就是一个并查集的题目,当在x到y区间有even个1时,我们可以得出在0到x-1和0到y区间中的1的个数的奇偶性是相同的,同理若有odd个1,0到x-1和0到y区间的1的个数的奇偶性就是不同的;所以我们就可以将数组分为两个部分表示是否相同与是否不同,我们可以用一个比较大的mod保证两个区间不重合,但是一看,(这个01序列的长度(<=1000000000))就知道我们不能naive地AC,因为这个数组太大了根本开不下,但是我们可以猜出这个询问并不会这么多(玄学*1);所以这个时候我们就需要用到STL!之前看的题解的话大多都是用哈希表,但是根据玄学,我们猜出询问次数不会很多,所以,可以用map来解决这个神奇的问题。(顺便还向大佬请教了一下map的用法)

#include<bits/stdc++.h>
#define mod 1000000000
using namespace std;
map<int,int> f;
int n,m,pos;
string s;
void st(int x){
	if (f.count(x)==0) f[x]=x;
}//这个函数用于判断次节点是否有初值,若没有则将它自己的父亲设定为自己;
int find(int x){
	if (x==f[x]) return f[x];
	f[x]=find(f[x]);
	return f[x];
}
bool same(int x,int y){
	return find(x)==find(y);
}
void link(int x,int y){
	f[find(x)]=find(y);
}
int main(){
	cin>>n>>m;
	pos=-1;
	for (int k=1; k<=m; k++){
		int x,y;
		cin>>x>>y>>s;
		if (pos!=-1) break;
		st(x-1);st(y);st(x-1+mod);st(y+mod);
		if (s[0]==‘e‘){
			if (same(x-1,y+mod) || same(x-1+mod,y)){
				pos=k;
			}
			link(x-1,y);
			link(x-1+mod,y+mod);
		}
		else {
			if (same(x-1,y) || same(x-1+mod,y+mod)){
				pos=k;
			}
			link(x-1,y+mod);
			link(x-1+mod,y);
		}
	}
	if (pos!=-1)
	cout<<pos-1<<endl;
	else cout<<m<<endl;
	return 0;
}

啊哈哈,你以为这样就AC了吗?naive!但是是不是觉得之前的推理很有道理?对啊!我也是怎么觉得的,但是这惨痛的分数告诉了我们这个冷酷的事实.

没错,我也很想不通,改了又改,改了又改。最终,还是去求助大佬了。听了大佬的思路。woc,这和我的思路不是一样的吗?(玄学*2),唯一不同的一点就是,他的区间分别是0~x和0~y+1,而我的思路是0~x-1和0~y(玄学*3),于是我带着试一试的思路试了一试(玄学*4)。

#include<bits/stdc++.h>
#define mod 1000000006
using namespace std;
map<int,int> f;
int n,m,pos;
string s;
void st(int x){
	if (f.count(x)==0) f[x]=x;
}
int find(int x){
	if (x==f[x]) return f[x];
	f[x]=find(f[x]);
	return f[x];
}
bool same(int x,int y){
	return find(x)==find(y);
}
void link(int x,int y){
	f[find(x)]=find(y);
}
int main(){
	cin>>n>>m;
	pos=-1;
	for (int k=1; k<=m; k++){
		int x,y;
		cin>>x>>y>>s;
		if (pos!=-1) break;
		st(x);st(y+1);st(x+mod);st(y+1+mod);
		if (s[0]==‘e‘){
			if (same(x,y+1+mod) || same(x+mod,y+1)){
				pos=k;
			}
			link(x,y+1);
			link(x+mod,y+1+mod);
		}
		else {
			if (same(x+mod,y+1+mod) || same(x,y+1)){
				pos=k;
			}
			link(x,y+1+mod);
			link(x+mod,y+1);
		}
	}
	if (pos!=-1)
	cout<<pos-1<<endl;
	else cout<<m<<endl;
	return 0;
}

呵呵呵呵,玄学玄学,社会社会,(玄学*5),嗯哼?我会说我很绝望吗?当然不会了。(woc明天居然还有考试我当然绝望了!太tm绝望了。)

时间: 2024-10-10 09:53:45

小胖的奇遇——论玄学的相关文章

bzoj3157国王奇遇记(秦九韶算法+矩乘)

bz第233题,用一种233333333的做法过掉了(为啥我YY出一个算法来就是全网最慢的啊...) 题意:求sigma{(i^m)*(m^i),1<=i<=n},n<=10^9,m<=200 别人的做法: O(m^2logn),O(m^2),甚至O(m)的神做法 学渣的做法:矩乘+秦九韶算法,O(m^3logn),刚好可以过最弱版本的国王奇遇记的数据 (极限数据单点其实是1.2s+,不想继续卡常了-bzoj卡总时限使人懒惰-如果把矩乘的封装拆掉可能会快点吧,然而人弱懒得拆了...

王小胖之数字转大写

使用场景:一般在书写正规金额的时候都要求填写大写数字. 实现功能:数字转大写功能主要实现:输入小写阿拉伯数字,转换成大写 数据实例:输入,12345678.90   输出,人民币:壹仟贰佰叁拾肆万伍仟陆佰柒拾捌元玖角 功能实现: Html代码 <div class="input-group"> <input name="kw" type="text" class="form-control" placehol

王小胖之中文汉字转拼音

使用场景:看到一个字不知道读音,那么可以复制然后查一下. 实现功能:输入汉字,转换成带音标的读音,重点是能显示音标,便于学习读音. 数据实例:输入:“王小胖顶呱呱~~”  输出:“wáng xiǎo pàng dǐng guā guā ~~” 功能实现: html代码 <div class="input-group"> <input name="kw" type="text" class="form-control&q

小胖说事35-----Terminating app due to uncaught exception &amp;#39;CALayerInvalidGeometry&amp;#39;, reason: &amp;#39;CALayer posi

2011-06-11 15:19:17.167 ***[930:707] *** Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer position contains NaN: [160 nan]' *** Call stack at first throw: ( 0   CoreFoundation                      0x3365d64f __exce

【BZOJ】【3157】&amp;【BZOJ】【3516】国王奇遇记

数论 题解:http://www.cnblogs.com/zhuohan123/p/3726933.html copy一下推导过程: 令$$S_i=\sum_{k=1}^{n}k^im^k$$ 我们有$$ \begin{aligned} (m-1)S_i &= mS_i-S_i \\&=\sum_{k=1}^n k^im^{k+1}-\sum_{k=1}^n k^i m^k \\&=\sum_{k=2}^{n+1}(k-1)^i m^k-\sum_{k=1}^n k^i m^k \

成小胖学习微服务架构&#183;基础篇

看到最近“微服务架构”这个概念这么火,作为一个积极上进的程序猿,成小胖忍不住想要学习学习.而架构师老王(不是隔壁老王)最近刚好在做公司基础服务的微服务化研究和落地,对此深有研究. 于是成小胖马上屁颠屁颠的跑过去向老王请教:“王哥,我看微服务架构这么火,我也想学,您给我讲讲啥是微服务架构呗?” 老王笑了笑说:“要想知道什么是微服务架构,你得先知道什么系统架构设计.” 成小胖的理想是成为一名架构师,平时积累了不少知识,因此对“系统架构设计”这个概念还是很熟悉的,因此他马上就给出了答案[1]: 系统架

【OpenJudge 2.5-1700】这还是一道玄学题!【DFS】

描述 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方.输入无输入.输出按给定顺序和格式输出所有八皇后问题的解(见Sample Output). 样例输出 No. 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 No. 2 1 0 0 0 0 0 0 0 0 0 0 0

linux内核奇遇记之md源代码解读之十五bitmap原理

转载请注明出处:http://blog.csdn.net/liumangxiong 为人不识陈近南,走遍江湖也枉然.做raid不识bitmap,通通都是走过场. 那么bitmap究竟是何许人物,能够在raid5的场子里混得风生水起呢?话说最早raid5是没有bitmap这位门客的,突然有一天跑raid5的系统异常掉电了,客户发现异常掉电之后再写数据就出现了数据不一致的情况.查来查去发现raid5本身设计就有一个缺陷:raid5每次写至少要写两个磁盘,写过程中异常掉电的时候就会发现一个磁盘写完成而

linux内核奇遇记之md源代码解读之十四raid5非条块内读

转载请注明出处:http://blog.csdn.net/liumangxiong 如果是非条块内读,那么就至少涉及到两个条块的读,这就需要分别从这两个条块内读出数据,然后再凑成整个结果返回给上层.接下来我们将看到如何将一个完整的bio读请求拆分成多个子请求下发到磁盘,从磁盘返回之后再重新组合成请求结果返回给上层的. 4097 logical_sector = bi->bi_sector & ~((sector_t)STRIPE_SECTORS-1); 4098 last_sector =