[MST] [转化] P9531 [JOISC 2022] 复兴计划
posted on 2025-04-22 05:02:36 | under | source
题意:给 \(n\) 个点 \(m\) 条边的简单无向图,\(q\) 次询问,每次给一个 \(y\),求边权为 \(w_i=|x_i-y|\) 时 MST 权值和?\(n\le 5\times 10^2,m\le 10^5,q\le 10^6\)。
考虑利用绝对值函数的性质,单独计算每一条边的贡献。
考虑 kruskal 的过程,那么当前边可以产生贡献,当且仅当排序中排在它前面的边构成的子图中,该边两端点不在同一连通块。
不妨将其余边按照与 \(x_i\) 的大小关系分类,称为左部边和右部边。先考虑 \(y<x_i\) 的情况,首先右部边不会参与竞争,考虑左部边,随着 \(y\) 从 \(x_i\) 开始变小,边集不断变大,某个时刻两端点连通。那么确定左端点。右部边的情况是对称的,得到右端点。
处理出贡献区间后,答案是容易计算的。分讨取值然后扫描线即可。
将 \(x_i\) 排序后,动态维护前缀的最大生成树(边权为其排位)(最大生成树是因为最小边最大)。假如存在 \(u\to v\) 路径,将其与最小边替换并计算左端点(和最小边右端点)。那么 LCT 可以做到 \(O(m\log n)\)。
实际上直接暴力加边复杂度是 \(O(mn)\) 的。证明就考虑上述维护最大生成树的过程,假如一开始全用 \(0\) 权边连起来,那么一次产生当前边减最小边的贡献。总共就是最大生成树边权,\(O(mn)\)。

浙公网安备 33010602011771号