当前位置: 首页 > 网络知识

[POJ2912]Rochambeau(并查集)

时间:2026-01-29 09:37:59

传送门

题意:

n个人分成三组,玩石头剪子布游戏,同一组的人只能出同样固定的的手势,其中有一个是裁判不属于任何组,可以出任意手势,给出m个信息x op y 表示x,y是从三个组里面随机抽取的或者是裁判,他们之间的输赢关系。让你判断最少在第几组信息时,可以唯一判断出裁判,并将裁判号,以及在第几组后判断出来的输出。

思路:
注意这里是能够唯一确定,也就是存在确定的唯一一个裁判。那么我们可以从n个人里面枚举裁判,然后判断除去裁判之后是否还存在矛盾的关系(存在矛盾肯定是裁判在其中导致的),如果存在那么排除该人,记录在第几个信息出现的。枚举完后,如果只存在一个矛盾的人那么这个人就是裁判,如果不存在矛盾,输出Impossible,否则就表示存在多个裁判,输出Can not determine 这里存在矛盾的判断就是用分类并查集处理的了。

——代码

1 #include <cstdio> 2 #include <cstring> 3 #define N 1000001 4 #define max(x, y) ((x) > (y) ? (x) : (y)) 5 6 int n, m, k, ans, cnt; 7 int a[N], b[N], f[N], d[N], err[N]; 8 char s[N]; 9 10 inline int find(int x) 11 18 return f[x]; 19 } 20 21 int main() 22 43 if(s[j] == '<' && (d[a[j]] d[b[j]] + 3) % 3 != 1 && (d[b[j]] d[a[j]] + 3) % 3 != 2) 44 48 if(s[j] == '>' && (d[a[j]] d[b[j]] + 3) % 3 != 2 && (d[b[j]] d[a[j]] + 3) % 3 != 1) 49 53 } 54 else 55 61 if(s[j] == '<') 62 66 if(s[j] == '>') 67 71 } 72 } 73 } 74 k = ans = cnt = 0; 75 for(i = 0; i < n; i++) 76 82 ans = max(ans, err[i]); 83 } 84 if (cnt == 0) puts("Impossible"); 85 else if (cnt == 1) printf("Player %d can be determined to be the judge after %d lines\n", k, ans); 86 else puts("Can not determine"); 87 } 88 }
View Code



上一篇:[CODEVS1916] 负载平衡问题(最小费用最大流)
下一篇:[luoguP1901] 发射站(单调栈)
并查集
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器
  • 英特尔第五代 Xeon CPU 来了:详细信息和行业反应
  • 由于云计算放缓引发扩张担忧,甲骨文股价暴跌
  • Web开发状况报告详细介绍可组合架构的优点
  • 如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳
  • 美光在数据中心需求增长后给出了强有力的预测
  • 2027服务器市场价值将接近1960亿美元
  • 生成式人工智能的下一步是什么?
  • 分享在外部存储上安装Ubuntu的5种方法技巧
  • 全球数据中心发展的关键考虑因素
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器

    英特尔第五代 Xeon CPU 来了:详细信息和行业反应

    由于云计算放缓引发扩张担忧,甲骨文股价暴跌

    Web开发状况报告详细介绍可组合架构的优点

    如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳

    美光在数据中心需求增长后给出了强有力的预测

    2027服务器市场价值将接近1960亿美元

    生成式人工智能的下一步是什么?

    分享在外部存储上安装Ubuntu的5种方法技巧

    全球数据中心发展的关键考虑因素