CF2022D2 Asesino (Hard Version) 题解
前言
神仙题。
题意
交互题,有
| 好人 | 坏人 | 内鬼 | |
|---|---|---|---|
| 好人 | Yes | No | Yes |
| 坏人 | No | Yes | No |
| 内鬼 | No | Yes | - |
例如,你问内鬼一个好人是不是好人,他会回答 No。
简单版中,你需要通过
Solution
Easy Version
如果不考虑内鬼,发现直接的 Yes 或者 No 带来了很少的信息,你同时交换所有人的身份甚至仍然是对的。
进一步的假如没有内鬼,事实上 Yes 和 No 带来的信息是两个人身份相同 / 不同。
不过内鬼会在相同和不同上露馅,如果两个人互相问问,答案应该是一样的,如果中间有一个内鬼,答案就不同。
所以,我们可以用两次询问确定内鬼是否在某两个人当中。
这样很简单了,我们两个人两个人问,如果确定在这两个人当中,选择这两人中的一个和外面的一个人(此时可以确定不是内鬼)再做一次就可以确定是这两个人中哪一个了。
否则最后必然剩下一到两个人,用一样的方案确定即可。
观察到这种情况下,
你不会以为这个就能通过困难版了吧。
Hard Version
为啥不是最优啊?
首先感觉一下,最优解应该不可能小于
看来偶数已经是最优了,奇数还可以优化。
感觉上,奇数的方案上,还剩
但是我们穷尽了 所以为什么还没有 AC?
看来只能是
我们需要避免最后剩三个的情况,考虑一开始就除去三个。
最开始就让
否则说明在他们三个中间,我们再用
这下
发现在他们三个中间的时候,我们再问
AC Code
Link
proof
(翻译自 CF 官方题解)
考虑由查询生成的有向图。根据鸽巢原理,至少有一个节点的入度为
0 ,至少有一个节点的出度为0 。
如果这两个节点不同,则称
A 为入度为0 的节>点,B 为出度为0 的节点,存在两种情况满足回答全部是 Yes:
如果这两个节点相同,那么图看起来就像是一个循环和一个孤立节点的集合。假设最后一次询问是
A 询问B ,存在两种情况满足回答除了最后一次全是 Yes:
因此,我们已经证明,在
n - 1 个询问中,无论问什么问题,都不可能在n 个人中找到内鬼。\blacksquare The End.