题意简述
$n$个点的边带权树,给$m$条关键的链。把树上一条边的权值变为0,使得$m$条链的和中,最大值最小。 $n,m<=1e5$。
思路
二分最大值$k$。现在考虑如何检验一个$k$。
找到所有链和$>k$的链,设这里面最长的链长度为$S$,有$C$条这样的链。用树链剖分找到被所有$C$条链都覆盖的边。设边权为$w$,如果$S-w<=k$,又因为这条边被所有和$>k$的链都覆盖了,所以,将这条边边权设为$0$,就珂以把所有和$>k$的链修♂正回来。那就满足条件了,检验结果为true。
然后就这样二分即珂。
关于如何求被所有链都覆盖的边
如果您足够明智,跳过这个部分好了。
开一颗临时的树,所有边权为$0$,树链剖分维护:对于所有和$>k$的链$(a,b)$,在链上的边权都+1。
然后只要找边权$=C$的边即珂。
但是树链剖分维护的是点权,怎么把边权转化成点权呢?只要把一条边的权值,记录在这条边的儿子上即珂。然后我们对于链$(u,v)$作加法操作的时候,记得把$LCA(u,v)$的操作给撤回掉(就是减掉),因为这个是多算的。
代码
1 |
|