带权二分(wqs二分)

我搬运我自己应该算原创吧

适用题型及思路

求贡献和的最值, 但是限制了某个东西必须选恰好 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 n5104,m105,1w100

思路

先这么想:

我们对这棵树进行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)δ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值