HonestOrUnkind

HonestOrUnkind

说到 Unkind,很难不让人想到这张图。


考虑何时无解,我们声称此时需要满足 \(A \leq B\)

具体地,我们让 \(B-A\) 个不诚实者对所有人给出相同的回答,让 \(A\) 个不诚实者对所有人给出与这 \(A\) 个诚实者对称的答案,此时我们无法区分这 \(A\) 个诚实者与不诚实者。

接下来满足 \(A > B\),我们的策略是先找到一个诚实者,再询问 \(n-1\) 次得到答案。

考虑此时 \(\text{query}(x,y)\) 可能的情况:

  • 回答是,此时有如下情况:

    • \(x\) 是诚实者,\(y\) 是诚实者

    • \(x\) 是不诚实者,\(y\) 是诚实者

    • \(x\) 是不诚实者,\(y\) 是不诚实者

  • 回答否,此时有如下情况:

    • \(x\) 是诚实者,\(y\) 是不诚实者

    • \(x\) 是不诚实者,\(y\) 是诚实者

    • \(x\) 是不诚实者,\(y\) 是不诚实者

发现回答否时,\(x\)\(y\) 中必有至少 \(1\) 个不诚实者,可以两个都飞了。

考虑每次飞了两个人的时候,去掉的不诚实者数量一定 \(\geq\) 诚实者的数量。

考虑维护一个栈,每次将栈顶与当前的数进行询问,考虑最后的栈顶一定是诚实者。

首先,我们注意到栈中的诚实者数量一定 \(>\) 不诚实者数量,所以栈中必定有人。

显然,栈中的人构成了一个认可链,其必然是从不诚实到诚实,栈顶必然是诚实者。

接下来用诚实者询问即可,可以通过。

posted @ 2026-06-05 10:46  Oken喵~  阅读(13)  评论(0)    收藏  举报