DP 优化 - wqs 二分
WQS 二分又称带权二分和 dp 凸优化。
前排传送门:
https://www.cnblogs.com/alex-wei/p/DP_Involution.html
https://blog.csdn.net/a_forever_dream/article/details/105581221
适用性
该算法的使用特征显著:一般出现在强制某个值恰好 \(=x\) 或者 \(\leq m\) 或 \(\geq m\)。
具体地,可以是物体选取时必须选取 \(m\) 个;可以是二维 dp 某一维必须是 \(m\)。
wqs 二分应用在 1D dp / 2D dp 上。wqs 二分可以将二维 dp 的某一维扔掉(被限制的维度)。
同时,能应用 wqs 二分的东西 \(f(i)\)(1D / 1D dp,后者是二维扔了一维度之后的) 必须满足凸性。但是凸性不好证,于是使用打表和盲猜法:\(O(nk)\) 不能做的可以大胆猜想是凸。
思想
首先该函数 \(f(i)\) 满足凸性,尝试去刻画这个凸包,刻画成功后就能求出 \(f(i)\) 即 dp 值。
由于某个值被限制,考虑拿着一个直线去截这个凸包,因为是凸包,类比斜率优化的想法,这个交点一定是某种“最优”。然后对于这个直线,可以用类似斜率优化的方法求出它的 \(k\)(斜率,其实是传进去的)、\(x\)(交点,横坐标)、\(b\)(截距)。此时就能算出 \(x\) 点的纵坐标 \(f(i) = kx + b\)。
因为要求点 \((m, f(m))\),所以我们要通过调整斜率 \(k\) 的方法,让直线切凸包于 \((m,f(m))\),从而得到 \(f(m)\)。
然后因为这是个凸包,所以 \(k\) 和 \(x\) 是有关联的。
以下内容基于前提,钦定凸包是下凸包,上凸包简单类比即可。
此时如果交点 \(x \lt m\),则 \(k\) 过小,要增大 \(k\);
如果交点 \(x = m\),恭喜找到答案;
如果交点 \(x \gt m\),\(k\) 过大,减小 \(k\)。
所以这个外层可以二分解决。
内部的问题是在调整斜率后求最值切点,原来的 \((x,f(x))\) 变成 \((x,f(x)-xk)\),然后类斜率优化去求就行了。
要注意的是,内部 \(f(i)\) 的 \(i\) 不一定是枚举的东西,而是一个被限制的那一维。

浙公网安备 33010602011771号