给定一些障碍,用这些障碍来切断根节点到所有叶子节点的路径,可以移动障碍,求总时间最少
二分枚举时间显而易见。
每个军队显然越靠近根结点越优,于是我们倍增的往上跳就可以完成这一步。
然后我们检查一遍那些根结点的子树没有被覆盖。
- 那些没有覆盖的子树,只能靠多余的节点来帮忙覆盖。
- 将可以进行这些操作的军队提取出来(倍增的往上跳别用它。)
- 然后再把需要覆盖的根结点的子树的也提取出来。
贪心去思考这个问题,首先为了保证自己覆盖,我一定选择剩余路程最短来覆盖自己或者自己覆盖。即如果搜到自己的时候发现还没覆盖自己当然优先自己子树。
代码
1 |
|