卿学姐与诡异村庄(并查集)

C - 卿学姐与诡异村庄

Time Limit: 4500/1500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
 

日复一日,年复一年,春去秋来。

卿学姐终于从天行廖那里毕业啦。出山的卿学姐首先来到了一个诡异的村庄。

在这个村庄中,只有两种人,一种是好人,一种是坏人。

好人只说真话,坏人只说假话。

村庄虚伪的平静由于卿学姐的到来,终于被打破了。

人们开始互相指控,每个人都会说另外一个人是否是好人。

卿学姐修行途中只学会了膜法,却不谙世事,所以卿学姐无法确认哪些人是好人,哪些人是坏人。

但是机智的卿学姐意识到可以通过这些人的指控来分辨。

现在告诉你村庄中每个人指控谁是否为好人,请问是否有个合理的分类能够符合所有的指控。

Input

第一行一个整数 N N,表示村庄总共有 N N个人,村民从 1 1开始编号到 N N

1N100000 1≤N≤100000

接下来 N N行,每行两个整数, ai,t ai,t,如果 t t 1 1,那么说明第 i i个人认为第 ai ai个人是好人。如果 t t 2 2,那么说明第 i i个人认为第 ai ai个人是坏人。

1aiN 1≤ai≤N

Output

如果存在一个好人坏人的分类能够满足所有的指控,那么输出"Time to show my power",否则输出"One face meng bi"

Sample input and output

Sample Input Sample Output
3
2 2
3 1
1 2
Time to show my power
3
2 2
3 2
1 2
One face meng bi

Hint

第一组样例中,如果1是好人,2和3都是坏人,就能解释得通这些指控

黑色数字为说真话,红色数字为说假话。

第一样例:


第二样例:


看两张图就能够知道,如果存在不成立的情况,必然是有一个人自相矛盾的,所以只要假设1是说真话,则将1所说的值并起来,而且还要将1是说假话,将假话的值

的相反的值并起来。


AC代码:


#include<iostream>  
#include<algorithm>  
#include<cstring>  
#include<string>  
#include<cstdio>
#include<queue>
#include<set>
using namespace std;  
#define T 100000+50  
#define inf 0x3f3f3f3f  
typedef long long ll;

int f[T<<1];

void Init()
{
	for(int i=0;i<T;++i){
		f[i] = i;
	}
}

int find(int x)
{
	int tmp = x;
	while(x!=f[x])
	{
		x = f[x];
	}
	while(tmp!=x)
	{
		int t = f[tmp];
		f[tmp] = x;
		tmp = t;
	}
	return x;
}


int main()
{
#ifdef zsc
	freopen("input.txt","r",stdin);
#endif

	int n,m,i,j,k;
	while(~scanf("%d",&n))
	{
		Init();
		int u,v;
		for(i=1;i<=n;++i){
			scanf("%d%d",&u,&v);
			if(v==1){
				int tx = find(u*2-1),ty=find(i*2-1);
				if(tx!=ty){
					f[tx] = ty;
				}
				tx = find(u*2),ty = find(i*2);
				if(tx!=ty){
					f[tx] = ty;
				}
			}
			else {
				int tx = find(u*2),ty=find(i*2-1);
				if(tx!=ty){
					f[tx] = ty;
				}
				tx = find(u*2-1),ty = find(i*2);
				if(tx!=ty){
					f[tx] = ty;
				}
			}
		}
		bool flag = false;
		for(i=1;i<=n;++i)if(find(i*2)==find(i*2-1)){flag = true;break;}
		if(flag)printf("One face meng bi\n");
		else printf("Time to show my power\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值