【35.53%】【POJ 2912】Rochambeau
Time Limit: 5000MS Memory Limit: 65536K
Total Submissions: 2837 Accepted: 1008
Description
N children are playing Rochambeau (scissors-rock-cloth) game with you. One of them is the judge. The rest children are divided into three groups (it is possible that some group is empty). You don’t know who is the judge, or how the children are grouped. Then the children start playing Rochambeau game for M rounds. Each round two children are arbitrarily selected to play Rochambeau for one once, and you will be told the outcome while not knowing which gesture the children presented. It is known that the children in the same group would present the same gesture (hence, two children in the same group always get draw when playing) and different groups for different gestures. The judge would present gesture randomly each time, hence no one knows what gesture the judge would present. Can you guess who is the judge after after the game ends? If you can, after how many rounds can you find out the judge at the earliest?
Input
Input contains multiple test cases. Each test case starts with two integers N and M (1 ≤ N ≤ 500, 0 ≤ M ≤ 2,000) in one line, which are the number of children and the number of rounds. Following are M lines, each line contains two integers in [0, N) separated by one symbol. The two integers are the IDs of the two children selected to play Rochambeau for this round. The symbol may be “=”, “>” or “<”, referring to a draw, that first child wins and that second child wins respectively.
Output
There is only one line for each test case. If the judge can be found, print the ID of the judge, and the least number of rounds after which the judge can be uniquely determined. If the judge can not be found, or the outcomes of the M rounds of game are inconsistent, print the corresponding message.
Sample Input
3 3
0<1
1<2
2<0
3 5
0<1
0>1
1<2
1>2
0<2
4 4
0<1
0>1
2<3
2>3
1 0
Sample Output
Can not determine
Player 1 can be determined to be the judge after 4 lines
Impossible
Player 0 can be determined to be the judge after 0 lines
Source
Baidu Star 2006 Preliminary
Chen, Shixi (xreborner) living in http://fairyair.yeah.net/
【题解】
做法:
带权并查集
枚举某个人是裁判。如果它是裁判仍会发生冲突。那么就记录最先发生冲突的点在哪里;
(遇到和裁判有关的信息就直接跳过。因为裁判可以什么都出,所以它的信息没有意义。);
记录有多少个人满足:如果裁判是这个人整段信息不会发生冲突;
设为cnt;
如果cnt为0则说明不管谁是裁判都会发生冲突。则所给的信息是impossible的;
如果cnt为1则说明恰好有一个人满足裁判的要求。那么裁判就是他了。至于最早判断的地方就是其他n-1个不满足要求的裁判最早发生冲突的点的最大值。只有在那个信息结束后才能判断其他人不是裁判。
如果cnt大于1,则有多个人满足要求。那么就不能确定。
带权并查集的状态转移和食物链那题类似,我发下链接:
http://blog.csdn.net/harlow_cheng/article/details/52736452
#include <cstdio>
#include <algorithm>
const int MAXN = 600;
const int MAXM = 2999;
struct rec
{
int x, y, z;
};
int n, m;
int f[MAXN], re[MAXN],fe[MAXN];
rec a[MAXM];
//0 same
//1 shu
//2 ying
int ff(int x)
{
if (f[x] == x)
return x;
int olfa = f[x];
f[x] = ff(f[x]);
re[x] = (re[x] + re[olfa]) % 3;
return f[x];
}
int main()
{
//freopen("F:\\rush.txt", "r", stdin);
while (~scanf("%d%d", &n, &m))
{
for (int i = 1; i <= m; i++)
{
char t;
scanf("%d", &a[i].x);
t = getchar();
while (t == ' ') t = getchar();
scanf("%d", &a[i].y);
if (t == '<')
a[i].z = 1;
else
if (t == '>')
a[i].z = 2;
else
a[i].z = 0;
}
for (int i = 0; i <= n - 1; i++)
fe[i] = -1;
for (int ju = 0; ju <= n - 1; ju++)
{
for (int i = 0; i <= n - 1; i++)
f[i] = i, re[i] = 0;
for (int i = 1; i <= m; i++)
{
if (a[i].x == ju || a[i].y == ju)
continue;
int l = ff(a[i].x), r = ff(a[i].y);
if (l == r)
{
int temp = (re[a[i].x] - re[a[i].y] + 3) % 3;
if (temp != a[i].z)
{
fe[ju] = i;
break;
}
}
else
{
f[l] = r;
re[l] = (a[i].z + re[a[i].y] - re[a[i].x] + 3) % 3;
}
}
}
int cnt = 0,judge,ma = 0;
for (int i = 0; i <= n - 1; i++)
{
if (fe[i] == -1)
{
cnt++;
judge = i;
}
ma = std::max(ma, fe[i]);
}
if (cnt == 0)
puts("Impossible");
else
if (cnt == 1)
printf("Player %d can be determined to be the judge after %d lines\n", judge, ma);
else
printf("Can not determine\n");
}
return 0;
}
【35.53%】【POJ 2912】Rochambeau的更多相关文章
- 【poj 1984】&【bzoj 3362】Navigation Nightmare(图论--带权并查集)
题意:平面上给出N个点,知道M个关于点X在点Y的正东/西/南/北方向的距离.问在刚给出一定关系之后其中2点的曼哈顿距离((x1,y1)与(x2,y2):l x1-x2 l+l y1-y2 l),未知则 ...
- 【BZOJ 2288】 2288: 【POJ Challenge】生日礼物 (贪心+优先队列+双向链表)
2288: [POJ Challenge]生日礼物 Description ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, ..., AN. 她被允许选择不超 ...
- 【poj 3090】Visible Lattice Points(数论--欧拉函数 找规律求前缀和)
题意:问从(0,0)到(x,y)(0≤x, y≤N)的线段没有与其他整数点相交的点数. 解法:只有 gcd(x,y)=1 时才满足条件,问 N 以前所有的合法点的和,就发现和上一题-- [poj 24 ...
- 【poj 1988】Cube Stacking(图论--带权并查集)
题意:有N个方块,M个操作{"C x":查询方块x上的方块数:"M x y":移动方块x所在的整个方块堆到方块y所在的整个方块堆之上}.输出相应的答案. 解法: ...
- bzoj 2295: 【POJ Challenge】我爱你啊
2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec Memory Limit: 128 MB Description ftiasch是个十分受女生欢迎的同学,所以 ...
- 【POJ】【2348】Euclid‘s Game
博弈论 题解:http://blog.sina.com.cn/s/blog_7cb4384d0100qs7f.html 感觉本题关键是要想到[当a-b>b时先手必胜],后面的就只跟奇偶性有关了 ...
- 【链表】BZOJ 2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 382 Solved: 111[Submit][S ...
- BZOJ2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 284 Solved: 82[Submit][St ...
- BZOJ2293: 【POJ Challenge】吉他英雄
2293: [POJ Challenge]吉他英雄 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 80 Solved: 59[Submit][Stat ...
随机推荐
- 自定义连接池DataSourse
自定义连接池DataSourse 连接池概述: 管理数据库的连接, 作用: 提高项目的性能.就是在连接池初始化的时候存入一定数量的连接,用的时候通过方法获取,不用的时候归还连接即可.所有的连接池必须实 ...
- 初探postman
第一种:安装postman 扩展程序 第二种:本地 安装postman 登陆进来postman的界面 发送第一个postman请求 将请求保存到集合 未完,待续...
- Maximum Depth of Binary Tree 树的最大深度
Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...
- java中URLEncode和URLDecode
URLEncode和URLDecode用于完成普通字符串和 application/x-www-from-urlencoded MIME字符串之间的相互转化 如果传递的字符串中包含非西欧字符的字符串, ...
- LeetCode113 Path Sum II
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...
- Charles配置信息
1.下载Charles https://www.charlesproxy.com/download/ 2.破解 https://www.zzzmode.com/mytools/charles/ 或者 ...
- DateFormat 日期格式化类(必须掌握)
package com.sxt.utils.date1; import java.util.Date; import java.text.DateFormat; import java.text.Si ...
- Linux Mint 19.1 安装 Docker 过程笔记
Linux Mint 19.1 安装 Docker 过程笔记 参考了很多教程,可能有很多教程已经过时. 综合记录一下. 首先修改一下系统的源,使用国内的源. 然后安装 docker sudo apt ...
- [软考]之软件过程模型II 标签: 软件工程 2015-11-01 11:52 1612人阅读 评论(22) 收
上一篇博客总结了瀑布模型/V模型/增量模型这三种软件模型,然而我们还有一个很重要的问题忘了回答,那就是,什么是软件过程模型? 什么是软件过程模型? 软件过程是软件开发与维护的工作流程和工艺流程,是软件 ...
- js获取屏幕相关值
<html><script>function a(){document.write("屏幕分辨率为:"+screen.width+"*" ...