适用题型及思路
求贡献和的最值, 但是限制了某个东西必须选恰好 k k k个.
没有个数限制很容易做.
把有限制条件的东西带上一个附加一个假想贡献. 也就是说, 选了一个这个东西, 就往我们计算的答案总贡献里加上 δ \delta δ.
δ \delta δ 越大, 可能选得的这个东西数量越多/越少.
这样, 我们可以二分 δ \delta δ, 使得恰好选 k k k个, 然后贡献里减去我们假想出来的那一部分.
例题: [国家集训队2]Tree I
给你一个无向带权连通图, 每条边是黑色或白色. 让你求一棵最小权的恰好有 n e e d need need 条白色边的生成树.
边权为整数.题目保证有解.
n ≤ 5 ⋅ 1 0 4 , m ≤ 1 0 5 , 1 ≤ w ≤ 100 n \le 5 \cdot 10^4, m \le 10^5, 1 \le w \le 100 n≤5⋅104,m≤105,1≤w≤100
思路
先这么想:
我们对这棵树进行kruskal, 需要对边按照权值排序. 然而, 仅仅按照权值排序做出来的MST并不是恰好有 n e e d need need条白边的生成树. 所以要"打乱排序规则", 让白边更靠前或靠后一点.
如何修改白边的位置呢?
我们还发现, 白边也是取越小的权值的边. 所以, 尝试修改所有白边的权值, 全部加上 δ \delta δ, 然后做一下MST.
可以发现, 随着 δ \delta δ 的增大, 取得的白边数量 w w w 会减小(非严格), 也就是具有单调性. 所以二分 δ \delta δ 就可以解决了.
最后的答案是我们求的MST结果要减去 w ( n e e d ) ⋅ δ w(need) \cdot \delta w(need)⋅δ