[Notes] wqs 二分
参考 王钦石《浅析一类二分方法》。
凸性问题三例
Example 1
给定正整数序列 \(\{a_i\}_{i=1}^{n}\),将其分为若干段,设每段元素和为 \(S_i\),最小化 \(\sum S_i^2\)。
Solution:由于二次函数下凸,显然每一个数单独划分为一段答案最优。
Example 2
给定正整数序列 \(\{a_i\}_{i=1}^{n}\),将其分为若干段,设每段元素和为 \(S_i\),最小化 \(\sum(a\cdot S_i^2+b\cdot S_i+c)\)。
Solution:由于一次项与零次项的存在,将每个数单独划分不一定最优。容易设出朴素的动态 \(\text{dp}\) 方程 \(dp_i\) 表示前 \(i\) 个数的最优答案。可以根据二次函数的凸性,使用单调栈维护下凸壳,斜率优化解决。
Example 3
给定正整数序列 \(\{a_i\}_{i=1}^{n}\),将其分为恰好 \(k\) 段,设每段元素和为 \(S_i\),最小化 \(\sum S_i^2\)。
Solution:wqs 二分。
算法思想
\(\texttt{Example 3}\) 的核心问题在于 存在段数限制,在保留该限制的情况下,\(\text{dp}\) 始终存在二维状态,难以进一步优化。
考虑 \(\texttt{Example 2}\) 中的问题,相对于 \(\texttt{Example 1}\),其引入了一次项与零次项系数 \(b,c\) 使得最优划分段数不为 \(k\)。若令 \(a=1,b=0\),最优划分段数关于零次项系数 \(c\) 的取值 单调递减,这提示到 \(\texttt{Example 3}\) 可通过二分 \(c\),转换到 \(\texttt{Example 2}\) 解决。
对于某个 \(c\),设其在 \(\texttt{Example 2}\) 的答案为 \(f(c)\),此时恰好将序列分为 \(k\) 段,则答案为 \(f(c)-k\cdot c\)。
原问题的凸性前提
对于上述过程中的一处观察“最优划分段数关于零次项系数 \(c\) 的取值单调递减”,结合代价函数的凸性,考虑其本质。
设划分段数为 \(x\) 时,最优答案为 \(g(x)\),则在平面直角坐标系下,以 \(x\) 为横坐标,\(g(x)\) 为纵坐标,画出图像。
对于 \(\texttt{Example 3}\) 的问题,猜想图像为上凸壳,考虑证明:
要证图像为上凸壳,即证明 \(\forall i<j<k,\frac{g(i)-g(j)}{j-i}\geq\frac{g(j)-g(k)}{k-j}\)。
等价于证明 \(\forall i,g(i-1)-g(i)\leq g(i)-g(i+1)\)。
考虑在数列 \(\{a_i\}_{i=1}^{n}\) 之后添加正实数 \(x\),记此时将数列分为 \(i\) 段的答案为 \(g(x,i)\),记最优方案最后一段的最小决策点为 \(p(x, i)\)。
\(g(x, i)\) 关于 \(x\) 是连续的,且仅在最优方案中最后一段的长度不唯一处不可导。
此时有:
\[\frac{\text{d}\ g(x, i)}{\text{d}\ x}=x+\sum_{j=p(x,i)}^{n}a_j \]由于代价函数为凸函数,根据决策单调性有 \(p(x,i)\leq p(x,i+1)\),因此:
\[\frac{\text{d}\ g(x,i)}{\text{d}\ x}\geq \frac{\text{d}\ g(x,i+1)}{\text{d}\ x} \]所以 \(g(x,i)-g(x,i+1)\) 关于 \(x\) 单调不降。
由于有:
\[\lim_{x\rightarrow 0}(g(x,i)-g(x,i+1))=g(i)-g(i+1) \]\[\lim_{x\rightarrow \infty}(g(x,i)-g(x,i+1))=g(i-1)-g(i) \]因此 \(g(i-1)-g(i)\leq g(x,i)-g(x,i+1)\leq g(i)-g(i+1)\)。
以这个上凸壳为例,用一条斜率为 \(c\) 的直线去切该凸壳,则切点横坐标随 \(c\) 值减小而增大。可以发现此时二分的斜率 \(c\) 就是前文所说的零次项系数。
由此归纳出 wqs 二分的使用前提:问题具有 凹凸性。

非严格凸壳的特殊判断
根据 \(x\) 与 \(g(x)\) 建出的凸壳不一定具有严格凸性,此时可能出现凸壳上横坐标为给定的 \(k\) 的点与多个点共线的情况,此时不能够准确地二分到 \(k\) 的位置,需要特判解决。
若 \(c=x\) 时,最优划分段数大于 \(k\),而 \(c=x+1\) 时,最优划分段数小于 \(k\),则说明斜率为 \(c\) 的直线与凸壳相切时存在多点共线,因此取 \(c=x+1\) 的答案即可。

浙公网安备 33010602011771号