摘要: Kruskal 算法。考虑哪些边有可能被贪心选中。因为最小公倍数的要求太复杂、太苛刻,我们不妨忽略“最小”,只考虑是公倍数。因为这样新产生的边边权更大,不会影响答案。考虑点权是 k 的倍数的点之间的边,发现有用的边其中一个端点一定是大于等于 L 的第一个 k 的倍数。于是有用的总边数就被压缩到了 O(n log n) 级别。直接执行 kruskal 算法即可。此外,我们还可以不事先排序,用 priority_queue 把空间复杂度优化到 O(n)。 阅读全文
posted @ 2022-04-10 18:15 duyiblue 阅读(250) 评论(2) 推荐(1) 编辑
摘要: 先考虑 k 是偶数的情况,此时 k 必须是 2n 的约数,且不能是 n 的约数,并且 k 要尽量小,所以令 k = 2 的 (n 里 2 的最高次数 + 1) 次方即可。若 k 还是太大,说明偶数无解,考虑奇数。此时有一个非常巧妙的想法:令 k2 = 2n / k。会发现这个 k2 一定是满足条件的。 阅读全文
posted @ 2022-04-10 13:17 duyiblue 阅读(107) 评论(0) 推荐(1) 编辑