wqs二分/带权二分/凸优化 详解

前置芝士

基础二分+基础DP

算法流程

wqs二分是一个神奇的东西,经常用来把限制条件转化为二分来降低时间复杂度。

直接来道题比啥都清楚。P2619 [国家集训队]Tree I

常见类型:就像上面这道题一样,

在满足Y物品强制恰好选择了m个情况下总价值最大

如果题目没有 强制恰好选择了m个 这个条件,我们只考虑总价值最大,我们能够得到一个时间复杂度比较优秀的算法(暂时成为简单算法)。

有了这个条件了呢?

现在考虑二分一下Y物品的额外代价(可正可负),修改Y的代价后重新进行刚才的算法,顺便记录一下价值最大的情况下选择了多少个Y。

然后根据选择了多少个Y来调整二分边界。

最后最优情况是恰好选择m个Y时,我们把额外代价删去就是正确代价

很多时候需要二分到小数,而且需要卡精度, 正确性有的时候还需要多考虑考虑。

证明

借用某位大佬的图片

横坐标是我们强制选择的A的数量,纵坐标是在此条件下的最大价值。题目要求我们做的就是求g(m)

能用wqs二分的前提是g(k)图像是凸的(斜率是单调下降的)

我们上文中的

如果题目没有 强制恰好选择了m个 这个条件,我们只考虑总价值最大,我们能够得到一个时间复杂度比较优秀的算法(暂时成为简单算法)。

指的就是说我们可以方便的求出g(k)这个的全局最大值。我们怎么才能求出题目要求的g(m)?

wqs二分的操作是让g(k)加上了一条f(k)=Ak的直线。这个A就是我们上文中二分的值。

总能通过二分A,然后g(k)加上f(k)后,让g(m)+f(m)成为全局最大值。

然后我们就能通过简单算法求出这个g(m)+f(m)。

然后减去f(m)就能得到我们需要的答案了。

首先是这么做为什么正确?

我们二分的A最后被删去了,不会对答案造成影响。而且对于所有选择了m个Y的方案来说,我们的加上的f(m)都是一样的,不影响方案的选择。

然后是为什么能找到答案?也就是下面这句话

总能通过二分A,然后g(k)加上f(k)后,让g(m)+f(m)成为全局最大值。

这个可以从斜率方面考虑。

因为g(k)是凸函数,所以g(k)斜率g'(k)是单调下降的。直线f(k)=Ak的斜率为A是常数。所以g'(k)+f'(k)也是单调下降的。

所以我们可以通过调整f'(k)(也就是我们二分的A)来实现g'(k)+f'(k)上下移动。从而控制g'(k)+f'(k)零点位置(也就是g(k)+f(k)最高点位置)。我们只要让g(k)+f(k)最高点位置在k为m的时候取到,就ok了。

经典错误

很容易犯的一个错误,就是假设我们在二分钟记录Y的使用量的变量是cnt,我们最后输出的是g(k)+f(k)-f(cnt)。正确的应该是g(k)+f(k)-f(m)。

这个错误是因为存在m-1,m,m三点斜率相同的情况,g(m-1)+f(m-1)和g(m)+f(m)和g(m+1)+f(m+1)一样大,这时候cnt的值可能不为m。

练习题

题单

P2619 [国家集训队]Tree I挺简单一道题,这道题貌似可以通过一些神奇操作不用二分到小数,但我看不懂证明(跪了)凸性证明

P4983 忘情

一顿操作猛如虎,一化式子二百五,wqs二分+斜率优化DP,不会斜率优化DP的建议先学一下

P5308 [COCI2019] Quiz

wqs二分+斜率优化DP

P4383 [八省联考2018]林克卡特树

Gosha is hunting价值显然是二维凸的

posted @   wljss  阅读(215)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示