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

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

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

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

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

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

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

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

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

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

Input

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

1≤N≤100000

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

1≤ai≤N

Output

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

Sample Input

3
2 2
3 1
1 2

3
2 2
3 2
1 2

Sample Output

Time to show my power

One face meng bi

Hint

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

//非常强,竟然用并查集完美的解决了这个问题,有两个并查集,就是将每个人说的话,当做真话处理,也当做假话处理,两个并查集最后若没有相交部分则成立,也就是,每个人的话都不会自相矛盾,则成立

http://blog.csdn.net/zsc2014030403015/article/details/51255172

但是,这种做法只在这种特定的时候才管用,如果一个人说了多句话呢,或者问你谁是好人,谁是坏人呢?还是很难哪,这种题。。。

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define MX 100005
 4 #define has 100000
 5 int n;
 6 int f[MX*2];
 7
 8 int find_(int x)
 9 {
10     if (x!=f[x])
11         f[x]=find_(f[x]);
12     return f[x];
13 }
14 int join(int a,int b)
15 {
16     int x=find_(a),y=find_(b);
17     if (x!=y)
18         f[x]=f[y];
19 }
20
21 int main()
22 {
23     while (scanf("%d",&n)!=EOF)
24     {
25         for (int i=1;i<=n;i++) f[i]=i;
26         for (int i=has+1;i<=has+n;i++) f[i]=i;
27         for (int i=1;i<=n;i++)
28         {
29             int x,k;
30             scanf("%d%d",&x,&k);
31             if (k==1)
32             {
33                 join(i,x);
34                 join(has+i,has+x);
35             }
36             if (k==2)
37             {
38                 join(i,has+x);
39                 join(has+i,x);
40             }
41         }
42         int ok=1;
43         for (int i=1;i<=n;i++)
44         {
45             if (find_(i)==find_(has+i))
46             {
47                 ok=0;
48                 break;
49             }
50         }
51         if (ok)
52             printf("Time to show my power\n");
53         else
54             printf("One face meng bi\n");
55     }
56     return 0;
57 }

时间: 2024-08-29 14:08:52

卿学姐与诡异村庄(并查集)的相关文章

C - 卿学姐与诡异村庄(并查集+One face meng bi)

卿学姐与诡异村庄 Time Limit: 4500/1500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 日复一日,年复一年,春去秋来. 卿学姐终于从天行廖那里毕业啦.出山的卿学姐首先来到了一个诡异的村庄. 在这个村庄中,只有两种人,一种是好人,一种是坏人. 好人只说真话,坏人只说假话. 村庄虚伪的平静由于卿学姐的到来,终于被打破了. 人们开始互相指控,每个人都会说另外一个人是否是好人.

cdoj 1328 卿学姐与诡异村庄 Label:并查集 || 二分图染色

卿学姐与诡异村庄 Time Limit: 4500/1500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 日复一日,年复一年,春去秋来. 卿学姐终于从天行廖那里毕业啦.出山的卿学姐首先来到了一个诡异的村庄. 在这个村庄中,只有两种人,一种是好人,一种是坏人. 好人只说真话,坏人只说假话. 村庄虚伪的平静由于卿学姐的到来,终于被打破了. 人们开始互相指控,每个人都会说另外一个人是否是好人.

hdu1328卿学姐与诡异村庄

地址:http://acm.uestc.edu.cn/#/problem/show/1328 题目: 卿学姐与诡异村庄 Time Limit: 4500/1500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 日复一日,年复一年,春去秋来. 卿学姐终于从天行廖那里毕业啦.出山的卿学姐首先来到了一个诡异的村庄. 在这个村庄中,只有两种人,一种是好人,一种是坏人. 好人只说真话,坏人只说假话.

qwb与学姐 (带秩并查集)

qwb与学姐 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 149  Solved: 54[Submit][Status][Web Board] Description qwb打算向学姐表白,可是学姐已经受够了他的骚扰,于是出了一个题想难住他:已知一幅n个点m条边的无向图,定义路径的值为这条路径上最短的边的长度,现在有 k个询问,询问从A点到B点的所有路径的值的最大值.qwb听完这个问题很绝望啊,聪明的你能帮帮他吗? Input 一组数据.第一行三

B - 卿学姐与基本法 (离散化+成段更新+区间求和)

卿学姐与基本法 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status “做专题也要按照基本法” 离开了诡异的村庄,卿学姐来到了威廉·圣·乱七八糟王国,这里的国王咸鱼王是个智障. 国家涣散,盗贼四起,民不聊生. 见到这样的景象,卿学姐不禁潸然泪下,“悠悠苍天,奈何苦了苍生”. 自幼学习基本法的卿学姐决定向整个国家普及基本法,改善国家法度. 在这个国家总共有N

卿学姐与基本法 (线段树+离散化)

“做专题也要按照基本法” 离开了诡异的村庄,卿学姐来到了威廉·圣·乱七八糟王国,这里的国王咸鱼王是个智障. 国家涣散,盗贼四起,民不聊生. 见到这样的景象,卿学姐不禁潸然泪下,“悠悠苍天,奈何苦了苍生”. 自幼学习基本法的卿学姐决定向整个国家普及基本法,改善国家法度. 在这个国家总共有NN个人,每个人都有一个编号,编号从1开始. 由于整个国家的人实在是太多了,卿学姐每次只能对一个连续区间的编号的人普及基本法. 同时卿学姐还想知道在某个时刻某个区间还有多少人没有被普及基本法. Input 第一行两

hdu1344卿学姐种美丽的花

地址:http://acm.uestc.edu.cn/#/problem/show/1344 题目: 卿学姐种美丽的花 Time Limit: 8000/4000MS (Java/Others)     Memory Limit: 125535/65535KB (Java/Others) Submit Status 众所周知,在喵哈哈村,有一个温柔善良的卿学姐. 卿学姐喜欢和她一样美丽的花.所以卿学姐家的后院有很多的花坛. 卿学姐有nn个花坛,一开始第ii个花坛里有A[i]A[i]朵花.每过一段

卿学姐与魔法(优先队列)

个人心得:思路很简单,不过就是会超时,而且直接用数组的话肯定不够大. 所以就用优先队列,让里面只装N个数就好了,然后再次添加时进行比较,比他小就放进去. 不过这样超时,所以先将A,B排序,然后只要比队首大就break就可以过了. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<queue> 6 #include<

A - 卿学姐与公主(线段树+单点更新+区间极值)

A - 卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 某日,百无聊赖的卿学姐打开了某11区的某魔幻游戏 在这个魔幻的游戏里,生活着一个美丽的公主,但现在公主被关押在了魔王的城堡中. 英勇的卿学姐拔出利刃冲向了拯救公主的道路. 走过了荒野,翻越了高山,跨过了大洋,卿学姐来到了魔王的第一道城关. 在这个城关面前的是魔王的精锐部队,这些士兵