CJOJ P2430 - 【NOIP2015】运输计划
题意
有一颗n个节点的树,第i条边连接
ui 和vi,边权为wi。有m个任务,每个任务要从si前往ti,花费的时间是路径上的边权之和。
现在可以选择一条边,让这条边的边权变为0,。请你求出如果选择边可以使得最大的花费时间最小化
解法
树链剖分+树上查分+线段树+二分:
首先,在树上求大量的点对之间的距离就是用树链剖分,这里不多说过程
其次就是最小化最大花费,采用二分的做法:
二分答案mid,对于所有的dis>mid的任务,我们将其路径标记出来。假设有k个任务超出限制,那我们需要将这k 个任务dis全部减到mid之下,所以我们可以找到所有路径的公共边中的最长边x,判断dis max−wx是否≤mid即可
现在的关键就在于如何找到这k条路径的公共边,如果使用线段树区间加法肯定会超时,所以使用树上差分。
对于每一次从s 前往t,将s ,t的权+1;将LCA(s,t) 和father[LCA(s,t)]的权-1,一个点最终被覆盖的次数就是这个点所在子树的权和(因为边已经下放到了点上面,所以把覆盖次数记在点上借口)
复杂度
O(nlogn+mlogm)