P4654 [CEOI2017] Mousetrap 题解
见到两遍了,写一下题解。
这道题目也是我写出的第一道黑题。
以下均为考场思路。
文章同步于 CSP 2023 游记。
解题思路
记
手玩一下发现人和老鼠的操作必定按照下面四个步骤依次进行:
- 老鼠沿主干道移动,同时人堵住一条支路。
- 老鼠在某个节点沿一条支路进入一个子树,然后被自己弄脏的边堵死在某个叶子结点。
- 人在老鼠被堵死的时候堵住老鼠当前位置到
T 的路径上的所有支路,然后清理老鼠当前位置到T 的路径上所有被弄脏的边。 - 老鼠此时只能走到
T ,游戏结束。
步骤 1 和 3 的人的操作比较难模拟,注意到操作 2 是树上操作,可以用树形 DP 来计算,那么先考虑操作 2。
记
考虑当某个节点的所有子树都计算完毕后,老鼠进入该节点时人类的操作:
- 如果人类不堵与
f 最大的子树相连的边,那么老鼠肯定会走这条边,到达f 值最大的子树。 - 否则,老鼠会进入
f 值次大的子树。
显然让老鼠进入
老鼠进入该子树后,在操作 3 时还需要堵住其其他支路。可以直接在此处计算。那么转移方程显然:记
把步骤 2 考虑完之后尝试考虑步骤 3,假定老鼠在步骤 2 中从节点
步骤 1 堵路的操作比较难想,这时我们可以转换思路。注意到答案具有单调性,可以二分答案转化成判定性问题。
假定老鼠走主干道已经到达了某个节点
如果现在已经堵住了
正确性证明:若
既然对于每个子树钻或不钻对于老鼠而言是一定的,那么人的操作就显然了:人需要按照从
至此,这道题的思路就明确了。
代码
可以结合代码食用,虽然代码没写注释,但是思路大致清晰。
代码太长,扔到剪贴板了。