[luogu]P1084 疫情控制

Posted onglublog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[luogu]P1084 疫情控制相关的知识,希望对你有一定的参考价值。

原题链接:P1084 疫情控制

题意

给定一棵带权树,$1$号点为根节点,某些点上有军队。

现在要求移动这些军队,使军队覆盖所有的叶子节点,求移动距离最大值的最小值。

分析

很难直接求出最小值,我们可以考虑二分这个最小值,让原问题转化为判定问题。

二分最小值,我们只需要判断能否在$mid$距离内使军队全部移动到覆盖所有的叶子点。

1.上移军队

一个军队往哪个方向移动贡献最大?

明显是往根节点方向移动。

所以很明显我们第一步就是要把所有的节点尽可能地往上移动。

如果移动到顶(处于根节点的儿子节点),我们就记录下这个节点的余力(剩下还能走的距离),并且暂时保存并在途中删除这个点(留作备用)。

保存的时候记录一个点的来源,余力。

 

如何快速上移呢?

倍增预处理出上移$2^k$代祖先的移动距离,可以优化掉一个$log$。

 2.判断还要堵死哪些子树

然后跑一遍dfs,找出所有未被封死的子树,我们考虑怎么通过移动剩下节点去堵死它们。

3.移动军队堵死子树

我们把军队的余力和根节点到各子树的距离按从小到大排序。

考虑扫一遍并且考虑怎么堵。

我们考虑一支军队怎么发挥它的最大能力呢?

首先一支军队堵死它的子树是不需要考虑余力的。

 

从小到大扫一遍军队,如果发现军队所在的那棵子树没被堵死,那么直接堵上去就可以了。

为什么这样是正确的呢?

越强的军队应该堵死越远的子树,因为我们是从小到大扫军队的,所以这个军队肯定要堵死最近的那个子树。

但是它却能超越自己的能力堵死更远的子树,何乐而不为呢?

如果自己所在的那棵子树被堵死了,那么我们从小到大扫一遍,看看还有没有子树可以堵死,有就堵上去。

 

这样就可以判断能不能在规定时间里堵死所有子树了。

 

以上是关于[luogu]P1084 疫情控制的主要内容,如果未能解决你的问题,请参考以下文章

luogu P1084 疫情控制

洛谷P1084 疫情控制

洛谷 P1084 疫情控制 题解

P1084 疫情控制

P1084 疫情控制

P1084 疫情控制