P1084 [NOIP2012 提高组] 疫情控制
首先军队可以原地不动,时间越多越容易合法,先套上二分。
在不回到根的情况下,军队深度肯定越小越好。所以军队能往上移就移,如果能回到根就暂时在根对应的儿子那里驻扎。这个过程用树上倍增优化。
做完这一步后,我们找出需要军队驻扎的根的儿子(向下不经过军队就能到达叶子),现在就是要让其它军队移过来,考虑这个过程:
- 对于某个儿子剩余时间最少的一支军队。如果它移到根后移不回来了,那么它就应该乖乖待在原处,因为如果它移掉必定需要另一支军队通过根移过来,那支军队在根处剩余的时间更多,不如让它去帮助别的儿子;否则就移到根。
- 对于某个儿子剩余时间不是最少的那些军队,直接移到根。
接着就是一个简单的贪心匹配问题,把剩余时间较少的军队移动到移动时间较少的儿子。