2016 UESTC Training for Data Structures C 卿学姐与诡异村庄
2017-03-15 18:01
323 查看
日复一日,年复一年,春去秋来。
卿学姐终于从天行廖那里毕业啦。出山的卿学姐首先来到了一个诡异的村庄。
在这个村庄中,只有两种人,一种是好人,一种是坏人。
好人只说真话,坏人只说假话。
村庄虚伪的平静由于卿学姐的到来,终于被打破了。
人们开始互相指控,每个人都会说另外一个人是否是好人。
卿学姐修行途中只学会了膜法,却不谙世事,所以卿学姐无法确认哪些人是好人,哪些人是坏人。
但是机智的卿学姐意识到可以通过这些人的指控来分辨。
现在告诉你村庄中每个人指控谁是否为好人,请问是否有个合理的分类能够符合所有的指控。
Input
第一行一个整数NN,表示村庄总共有NN个人,村民从11开始编号到NN
1≤N≤1000001≤N≤100000
接下来NN行,每行两个整数,ai,tai,t,如果tt是11,那么说明第ii个人认为第aiai个人是好人。如果tt是22,那么说明第ii个人认为第aiai个人是坏人。
1≤ai≤N1≤ai≤N
Output
如果存在一个好人坏人的分类能够满足所有的指控,那么输出"Time to show my power”,否则输出"One face meng bi”
Sample Input
Sample Output
Hint
第一组样例中,如果1是好人,2和3都是坏人,就能解释得通这些指控
第一眼看到这个题。。。感觉像是食物链,但是按照这个思路想下去却没有结果(自己太菜了。
无奈去网上搜了题解,豁然开朗,DALAO的思路十分巧妙。
并查集
把i分成两个节点,一个是好人节点ig,一个是坏人节点ib。
在这里,把数组开成2*N,在1~N段存好人节点,在N+1~2N段存坏人节点。
如果i指认ai是好人,就把ig和aig合并,同时把ib和aib合并。
如果i指认ai是坏人,就把ib和aig合并,同时把ib和aib合并。
那么在什么情况下,学姐会“一脸懵逼”呢?
就是ig和ib被合并到一起去了。
以下为代码:
感觉自己还要努力啊。。。。。。。。。
卿学姐终于从天行廖那里毕业啦。出山的卿学姐首先来到了一个诡异的村庄。
在这个村庄中,只有两种人,一种是好人,一种是坏人。
好人只说真话,坏人只说假话。
村庄虚伪的平静由于卿学姐的到来,终于被打破了。
人们开始互相指控,每个人都会说另外一个人是否是好人。
卿学姐修行途中只学会了膜法,却不谙世事,所以卿学姐无法确认哪些人是好人,哪些人是坏人。
但是机智的卿学姐意识到可以通过这些人的指控来分辨。
现在告诉你村庄中每个人指控谁是否为好人,请问是否有个合理的分类能够符合所有的指控。
Input
第一行一个整数NN,表示村庄总共有NN个人,村民从11开始编号到NN
1≤N≤1000001≤N≤100000
接下来NN行,每行两个整数,ai,tai,t,如果tt是11,那么说明第ii个人认为第aiai个人是好人。如果tt是22,那么说明第ii个人认为第aiai个人是坏人。
1≤ai≤N1≤ai≤N
Output
如果存在一个好人坏人的分类能够满足所有的指控,那么输出"Time to show my power”,否则输出"One face meng bi”
Sample Input
3 2 2 3 1 1 23 2 2 3 2 1 2
Sample Output
Time to show my powerOne face meng bi
Hint
第一组样例中,如果1是好人,2和3都是坏人,就能解释得通这些指控
第一眼看到这个题。。。感觉像是食物链,但是按照这个思路想下去却没有结果(自己太菜了。
无奈去网上搜了题解,豁然开朗,DALAO的思路十分巧妙。
并查集
把i分成两个节点,一个是好人节点ig,一个是坏人节点ib。
在这里,把数组开成2*N,在1~N段存好人节点,在N+1~2N段存坏人节点。
如果i指认ai是好人,就把ig和aig合并,同时把ib和aib合并。
如果i指认ai是坏人,就把ib和aig合并,同时把ib和aib合并。
那么在什么情况下,学姐会“一脸懵逼”呢?
就是ig和ib被合并到一起去了。
以下为代码:
#include<iostream> #include<algorithm> using namespace std; int pre[200020],N; void init(int n) { int i = 1; for (i = 1; i <= n * 2; i++) pre[i] = i; } int find(int x) { int r = x; while (pre[r]!=r) { r = pre[r]; } int i = x, j; while (i!=r) { j = pre[i]; pre[j] = r; i = j; } return r; } void join(int x, int y) { int fx = find(x), fy = find(y); if (fx!=fy) { pre[fx] = fy; } } int good(int x) { return x; } int bad(int x) { return x + N; } bool same(int x, int y) { return find(x) == find(y); } int main() { cin >> N; init(N); int i, j, t; for (i = 1; i <= N; i++) { cin >> j >> t; if (t==1) { join(good(j), good(i)); join(bad(i), bad(j)); } else { join(good(i), bad(j)); join(bad(i), good(j)); } } for ( i = 1; i <= N; i++) { if (same(good(i),bad(i))) { cout << "One face meng bi" << endl; return 0; } } cout << "Time to show my power" << endl; return 0; }
感觉自己还要努力啊。。。。。。。。。
相关文章推荐
- 2016 UESTC Training for Data Structures C -> 卿学姐与诡异村庄 CDOJ 1328 并查集
- 2016 UESTC Training for Data Structures C - 卿学姐与诡异村庄 CDOJ 1328 并查集
- 2016 UESTC Training for Data Structures C - 卿学姐与诡异村庄 并查集
- 2016 UESTC Training for Data Structures D - 卿学姐与魔法 优先队列、构造
- 2016 UESTC Training for Data Structures E - 卿学姐与城堡的墙 树状数组求逆序对、离散化
- 2016 UESTC Training for Data Structures M - 卿学姐失恋了Ⅱ CDOJ 1350 汉诺塔 模拟
- 2016 UESTC Training for Data Structures O - 卿学姐种美丽的花 树状数组+等差数列
- 2016 UESTC Training for Data Structures A - 卿学姐与公主 CDOJ 1324 线段树
- 2016 UESTC Training for Data Structures B - 卿学姐与基本法 CDOJ 1325 线段树+离散化
- 2016 UESTC Training for Data Structures A - 卿学姐与公主 线段树
- 2016 UESTC Training for Data Structures B - 卿学姐与基本法 自己构建了一个和堆有点像的数据结构
- 2016 UESTC Training for Data Structures D - 卿学姐与魔法 CDOJ 1329 堆
- 2016 UESTC Training for Data Structures E - 卿学姐与城堡的墙 CDOJ 1341 树状数组 逆序对 离散化
- 2016 UESTC Training for Data Structures G - 郭大侠与阴阳家 CDOJ 1337 强行map
- 2016 UESTC Training for Data Structures H - 郭大侠与英雄学院 CDOJ 1338 并查集
- 2016 UESTC Training for Data Structures (1)
- 2016 UESTC Training for Data Structures I - 郭大侠与线上游戏 CDOJ 1339 pb_ds黑科技
- 2016 UESTC Training for Data Structures I - 郭大侠与线上游戏 2个set
- 2016 UESTC Training for Data Structures J - 郭大侠与Rabi-Ribi CDOJ 1334 优先队列
- 2016 UESTC Training for Data Structures J - 郭大侠与Rabi-Ribi 优先队列