题解 P8566
JohnVictor · · 题解
Solution 1
手玩
写一个爆搜或者状压 dp,期望通过数据点
Solution 2
本题的主要部分就是猜测和验证以下的一系列结论。诱导出结论的过程大致是从两头开始优化最终达到的平衡。
一种观点是每一次 Yes 会将整个游戏分治成两个游戏。在之后的题解中也会多次用到这个观点,我们会运用【当前的多边形】来表示被分治出来的某个游戏。之后我们会发现被在最优情况下分治出来的游戏只有一个还有再提问的空间。
结论 0 B 不会询问和已经确定存在的边相交的边,因为这些边肯定不存在。
结论 1 最优的
证明 注意到
此外注意到一次 Yes 询问相当于是将整个游戏分治成了两个游戏,当然和这次 Yes 相交的 No 也就不带来任何额外信息了。从这一点我们很容易看出 A 有如下策略:回答 Yes 当且仅当这次询问和之前的询问相交,这样一次 Yes 至少对应一次 No,也就是
而从同样的角度思考,我们也能给出一种 B 的策略。B 不断询问长度为 2 的边,并且保证被询问到的边是连续的一段。如果得到 Yes 的答案,有一个 No 白费了,并且
当然上述证明可能会带来疑问,例如会不会围成一圈了还没有得到答案。这当然是不会的,因为统计边数就能得知整个三角剖分至少有两条长为
结论 2 所有一直最优的策略如下:对于 B,每一次询问之后得到的所有 No 必须是当前的多边形中一些连续的长为
证明 上面的叙述中已经证明了 A 的策略(在假设 B 的策略的前提下),这里主要证明 B 的策略。
我们引入 坏弦 的定义,一条弦为坏的当且仅当它没有被问过,并且存在一种使得这条弦答案为 Yes 的问题,并且和两条以上问过的 No 相交。如果任意时刻出现坏弦,那么 A 告诉 B 这条弦答案为 Yes,B 必须询问这条弦,那么就亏了一次以上的操作。到这里可以用归纳法证明结论,然而这种证明要对前几条弦进行繁琐的讨论(可能要四步以上才会出现坏弦),感兴趣的读者可以自行补全。
这里叙述一个较为简短但是不那么自然的证明,同时可以引入一个比较好玩的结论。
引理 对于任意
如果有了引理,A 可以无脑回答
引理证明 我们对
首先证明这样的三角剖分存在。考虑所有长度为
当然唯一性也很好顺着上面的思路归纳得到。假设变成
考虑是从什么角度扩展来的。如果被缩掉的点
实现
直接拿链表甚至 set 来维护都行,主要不要漏情况,尤其是重复询问。用中点表示弦可以节省代码量。时间复杂度视实现为