闲扯
好久没有写闲扯了
这道题从昨天开始改,一直没过,突然间看到一篇题解,恍然大悟,终于改过了。。。
我的内心:mmp,这hs出题人
题面
Solution
因为可以同时移动,而且询问最少需要多久,更重要的是答案具有单调性,所以妥妥的二分答案。
那么问题就变成了怎么判断在 $lim$ 的时限内,完成对叶节点的管控。
首先,我们有一个贪心的想法:对于一个点,如果我们肯定要将它尽量的向上放。因为深度越小,能管控的叶子节点的数目一定是单调不减的。
然后我们需要分一下情况来讨论。
- 如果当前节点不能到达根结点,那么我们就跳到第一个能跳到的节点。
- 如果刚好能跳到根结点,那么我们就跳到这条链上根结点的子节点。
- 如果能跳到根结点,但是剩余的时间内没法跳到这条链上根结点的子节点,且前两种情况没有将它所在的子树中的叶节点全部管控,就跳回去。
剩下的根结点的子树中,如果还有叶节点没管控完的,我们就找剩下的,能跨过根结点的节点中,离它最近的一个。
为了方便处理叶节点是否管控完,我们先记录一下每一个点为根,包含了几个叶节点,然后用树状数组维护一下子树中已经管控了几个点(利用 $dfn$ 的性质)即可。
Code
1 |
|
总结
在考虑不同情况时一定要想好怎么才是最优的,不然写着写着就挂了。