Statement
有一个 \(n\) 个点的完全图,每个点有权值 \(p_i\),连接 \((u,v)\) 的边权值为 \(\max(p_u,p_v) \bmod \min(p_u,p_v)\)。
求最小生成树上边权和。
Solution
想使用 Kruskal 但你发现边数 \(n^2\),显然需要优化。
当 \(p_u = p_v\) 时 \((u,v)\) 这条边无贡献,权值为 \(0\),也就是说我们需要将这类相同权值的点缩点,也就是对点权离散化。
假设我们当前点权 \(p_x\),假设它与 \(p_y\) 连边且 \(p_x < p_y\),边权就是 \(0 \sim p_x - 1\) 中的某数,这样看来我们要考虑的点权就是 \([kx, (k + 1)x], k\in [1,\lfloor{\frac{\max{p_i}}{p_x}}\rfloor]\) 这样的区间,即枚举 \(p_x\) 的正整数倍去找与之匹配的点。
每次从每个区间最小的点依次连严格大于它的点连边,即对于 \(a < b < c < 2a\),我们连的边一定是 \((a,b),(b,c)\) 而不是 \((a,b),(a,c)\),后者不优。
边数就来到了 \(\log n\) 级别,再用 Kruskal 就是 \(O(n\log^2 n)\),开了三秒是跑得过的。
Code
Submission