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挺简单一道题,这道题貌似可以通过一些神奇操作不用二分到小数,但我看不懂证明(跪了)凸性证明
一顿操作猛如虎,一化式子二百五,wqs二分+斜率优化DP,不会斜率优化DP的建议先学一下
wqs二分+斜率优化DP
Gosha is hunting价值显然是二维凸的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!