258. 石头剪子布

题目传送门

题意挺好理解,但是当我看样例的时候就傻了。不是说好的只有一个裁判的吗?出现矛盾的时候该怎么判定裁判?

分析

观察这个数据量就会发觉是有猫腻的,直接从正面求出裁判并不是很容易,那么直接枚举裁判呢?由于裁判是可以随便出的,那么把它从所有对局中除去后理应没有矛盾才对。所以就有了如下做法

  • 枚举裁判,从前往后遍历对局,按照并查集例题食物链的做法去处理就行。可能遇到的情况有下面两种

    1. 直到发现第一个矛盾,那么当前枚举的这个人就不应该是裁判。然后把当前对局标号记录下来,表示最早到该对局时可以发现裁判并不是当前枚举的这个人

    2. 从头到尾没有矛盾,那么这个人可能就是裁判,答案结果数+1

  • 如果答案结果数大于1,表示可能的裁判有很多种,输出 Can not determine

  • 如果答案结果数为1,要输出排除其他所有不可能是裁判的人最小的对局号

  • 如果答案结果数为0,表示没有裁判,输出 Impossible

const int N = 505;
const int M = 2020;
struct node{
int a,b,c;
}q[M];
int fa[N*3],n,m,last[N];
int find(int x){return x == fa[x] ? x : fa[x] = find(fa[x]);}
//判断是否有矛盾
bool conflict(int j){
int a = q[j].a, b = q[j].b, c = q[j].c;
if(c == 0){
if(find(a) == find(b+n) || find(a) == find(b+2*n))return true;
fa[find(a)] = find(b);
fa[find(a+n)] = find(b+n);
fa[find(a+2*n)] = find(b+2*n);
}else if(c == 1){//a<b
if(find(a) == find(b) || find(a) == find(b+n))return true;
fa[find(a+2*n)] = find(b+n);
fa[find(a)] = find(b+2*n);
fa[find(a+n)] = find(b);
}else{
if(find(a) == find(b) || find(a) == find(b+2*n))return true;
fa[find(a+2*n)] = find(b);
fa[find(a+n)] = find(b+2*n);
fa[find(a)] = find(b+n);
}
return false;
}
int main()
{
while(~scanf("%d%d",&n,&m)){
for(int i=1;i<=m;i++){
char ch;
scanf("%d%c%d",&q[i].a,&ch,&q[i].b);
if(ch == '=')q[i].c = 0;
else if(ch == '<')q[i].c = 1;
else q[i].c = 2;
q[i].a++;q[i].b++;
}
//last数组存放最早的矛盾对局号,如果循环结束后还是-1表示枚举的人可以是裁判
memset(last,-1,sizeof last);
for(int i=1;i<=n;i++){
for(int j=1;j<=n*3;j++)fa[j]=j;
for(int j=1;j<=m;j++){
if(q[j].a == i || q[j].b == i)continue;
if(conflict(j)){
last[i] = j;
break;
}
}
}
int cnt = 0, id = 1, times = 0;
for(int i=1;i<=n;i++){
if(last[i] == -1){
cnt ++;
id = i;
}
times = max(times,last[i]);
}
//cout << cnt << endl;
if(cnt > 1)puts("Can not determine");
else if(cnt == 1)printf("Player %d can be determined to be the judge after %d lines\n",id-1,times);
else puts("Impossible");
}
return 0;
}

最后感谢题解区的各位大佬

最新文章

  1. 【翻译三】java-并发之线程对象和实现
  2. Swift Tour 随笔总结 (2)
  3. SRM 392(1-250pt)
  4. 项目管理软件伙伴https://www.huobanyun.cn/
  5. 第三天 Java语言基础
  6. ubantu/centos修改系统时间
  7. 网络编程基础【day10】:我是一个进程(三)
  8. IP路由实验之---Telnet远程登陆
  9. 雷林鹏分享:C# 数据类型
  10. 解决Devexpress ChartControl的CalcHitInfo当中SeriesPoint为Null的问题
  11. 21 模块(collections,time,random,os,sys)
  12. Linux修改开机启动logo
  13. BZOJ2694:Lcm——包看得懂/看不懂题解
  14. C++和C# WebService相互调用
  15. AcWing 153. 双栈排序
  16. 简单的WSGI server
  17. C#实现对EXCEL指定单元格进行操作
  18. destoon 支付异步接口文件 notify.php 调试方式
  19. 找top 10信息
  20. Jmeter之添加响应断言,bean shell post processor

热门文章

  1. Linux服务器下安装Composer 并使用Composer安装Thinkphp5.0
  2. navicat for mysql 破解版
  3. JavaScript DOM编程艺术(第2版)的简单总结
  4. requests+BeautifulSoup | 爬取电影天堂全站电影资源
  5. SQL注入-流程
  6. Spring MVC 接收 LocalDate、LocalTime 和 LocalDateTime Java 8 时间类型参数
  7. nginx日志按天切割
  8. DG主备切换遇到not allwod或者RESOLVABLE GAP解决办法
  9. ctfhub技能树—sql注入—整数型注入
  10. 国内最具影响力科技创投媒体36Kr的容器化之路