Description
题目链接:Luogu 1084
H 国有 $n$ 个城市由 $n−1$ 条双向道路连通成一棵树,$1$ 号城市是首都,也就是根节点。H 国的首都爆发了传染病。为了控制疫情,不让疫情扩散到边境城市(叶子节点所表示的城市),当局决定让军队在一些城市建立检查点,使得从首都到边境城市的每一条路径上都至少有一个检查点。除了首都,任何一个城市都可以建立检查点。
现在,在 H 国的一些城市中已经驻扎有军队,且一个城市可以驻扎多个军队。一支军队可以在有道路连接的城市间移动,并在最多一个城市建立检查点。军队移动需要的时间等于经过的道路的长度 $w$。请问最少需要多少个小时才能控制疫情。注意:不同的军队可以同时移动。
数据范围:$2\le m\le n\le 5\times 10^4$,$0<w<10^9$
Solution
预处理
我们可以发现,节点的深度越小,控制的节点(子树内的节点)越多,所以我们可以贪心地把军队尽量向上提。据此,我们需要把每个点往上的距离预处理,用倍增优化。
二分答案
题目要求的是:军队最大的移动时间的最小值,所以我们可以非常自然地想到二分答案,把问题转化为判定性问题(即是否可以在确定的时间内完成)。
判断合法
根据前面的分析,我们在 $\text{check}$ 的时候要尽量把军队往上走。当二分答案后,设答案为 $x$,这里会有两种情况:军队在 $x$ 的时间内可以到达根节点,军队在 $x$ 的时间内无法到达根节点。
-
首先解决军队的上提问题
-
如果一个军队无法到达根节点,那么他最高的位置一定是最优的,让他待在那里就可以了!
-
如果一个军队可以得到根节点,那我们求出他到达后还可以走多少时间 $rest$ 以及到达 $1$ 前的儿子 $id$,以便接下来的处理。
-
-
如果还有叶子没有被控制,那我们肯定是把军队调到 $1$ 的某个儿子,因此我们需要处理出 $1$ 的儿子有多少个需要被控制,记录它们和根节点的距离 $dist$。
-
最后处理可以到达 $1$ 的军队的去向。
- 先将这些军队按照 $rest$ 从小到大排序。如果某一个军队的 $id$ 需要被控制,那么就让他不要到达 $1$ 而直接待在 $id$ 就行了。因为如果他不回去,肯定需要别的军队过来控制这个 $id$,这样显然花费时间更大。
- 再将这些军队按照 $rest$ 从大到小排序,把需要被控制的点按照 $dist$ 从大到小排序。把这两个序列从前往后一一对比就行了!
-
是否合法的判断:如果步骤 $3$ 中军队用完了可还有节点需要被控制,那么不合法;否则合法。
时间复杂度:$O(n\log^2 n)$
Code
1 |
|