传送门
首先最开始说的那个一条路径的权值就是想告诉你两个点之间的贡献就是瓶颈边的权值。
那么肯定要用最小生成树算法。
于是我考场上想了30min+30min+30min+的树形dpdpdp
发现转移是优秀的nlognnlog_nnlogn,总时间复杂度O(n2logn)O(n^2log_n)O(n2logn)妙啊
然后有了弃疗的想法。
突然想到没有利用kruskalkruskalkruskal算法的性质。
其实就是一个kruskalkruskalkruskal重构树用到的思想,对于两个连通块,当前这条将它们连接起来的边是两个连通块的点连通的瓶颈
这就好办了。
只用算出这条边贡献了几次就行了。
咦线段树合并可做啊总复杂度O(nlogn2)O(nlog^2_{n})O(nlogn2)妙啊
咦等等好像启发式合并更好写啊。
咦等等…
终于等到了一个妙不可言的时刻。
我发现题目给的式子可以变形啊!
设对于限制∣Cu−Cv∣≥L|C_u-C_v|\geq L∣Cu−Cv∣≥L中较大的数为xxx,较小的数为yyy.
=>x≥y+Lx\geq y+Lx≥y+L
=>x>y+L−1x>y+L-1x>y+L−1
那么对于所有点,我们将CiC_iCi和Ci+L−1C_i+L-1Ci+L−1共同离散化。
然后对CiC_iCi和Ci+L−1C_i+L-1Ci+L−1分别维护两种权值线段树。
之后直接线段树合并就行了。
时间复杂度O(nlogn)O(nlog_n)O(nlogn)吊了标算?妙啊
放一波代码
转载于:https://www.cnblogs.com/ldxcaicai/p/10084818.html