2018.10.26 NOIP模拟 图(最小生成树+线段树合并)

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

你可能感兴趣的:(#,线段树合并,#,最小生成树)