解答
二分答案+贪心。
为了简化问题,我们先考虑在二分到\(mid\)时,哪些军队的位置是固定的。
显然,对于那些“不能到达根节点”,即dis
大于\(mid\)的节点,只能尽量向上移动。那么可以处理出这些点的最终位置,通过dfs
求出根的哪些子树没有被覆盖。(显然,其他节点都部署在根的儿子上)
之后,就是考虑能够到达根\(1\)的节点如何部署的问题了。(由于比较难满足,根据贪心的原则:)
- 优先考虑离根最远的儿子\(u\),如果该子树内有可以到达儿子的节点,取距根最远的(可部署的)\(x\)部署。
- 否则(或者该子树内所有军队均已被部署),取到根节点最近的节点\(x\)部署。
正确性:若可行解里\(x\)部署到了另外的子树\(v\)上。
- 考虑可行解里部署在该子树的军队\(w\),其必定可以与\(v\)交换位置。(由最远性)
那么直接写就可以了。
加强版
考虑加强版数据只能一个\(\log\),怎么办?
考虑不倍增怎么求“哪些子树被控制”。
标记那些“不能到达根节点”的节点的原位置,在dfs
时显然可以求出此时的节点距离子树内最近的已标记节点的距离(简单DP
),计算是否可能抵达(与\(mid\)比较)即可。