保序回归学习笔记
定义
保序回归是指,给定偏序关系 \(\preceq\) 和代价函数 \(\phi_i(x_i)\),求 \(\min\sum\limits_i\phi_i(x_i)\),其中 \(i\preceq j\rightarrow x_i\le x_j\)。直观理解就是修改 \(a\) 使得 \(a\) 满足对于一些点对有序,使得修改的代价函数最小。
下文讨论一维保序回归,即 \(1\preceq2\preceq\dots\preceq n\),且要求 \(\phi_i(x_i)\) 是凸函数。当 \(\phi_i(x_i)=|a_i-x_i|\) 时称为 \(L_1\) 保序回归,当 \(\phi_i(x_i)=(a_i-x_i)^2\) 时称为 \(L_2\) 保序回归。\(L_\infty\) 为 \(\min\max|a_i-x_i|\),这个可以二分答案后贪心解决。
Slope Trick
Slope Trick 可以解决 \(L_1\) 保序回归问题,具体见洛谷 P4331。
PAVA 算法
考虑对于一个连续块 \(B=[l,r]\),取一个最小的值 \(m(B)\) 使得 \(F_B(x)=\sum\limits_{i=l}^r\phi_i(m(B))\) 最小,如 \(L_1\) 保序回归就取下中位数,\(L_2\) 保序回归就取平均数。一开始每个点单独成块,从左到右维护每个块,如果相邻块满足 \(m(B_i)>m(B_{i+1})\) 则合并这两个块然后继续向左合并知道 \(m(B_i)\) 不降。合并次数为 \(\mathcal{O}(n)\),复杂度为 \(n\) 乘上合并依次重新计算 \(m(B)\) 的复杂度。
下面说明这个算法的正确性:先证明一个引理:对于两个凸函数 \(F(x),G(y)\),设二者的最小最优点分别为 \(p,q\),若 \(p>q\),我们说明 \(\min\limits_{x\le y}F(x)+G(y)\) 存在最优解满足 \(x=y\)。考虑若现在存在一个最优解 \(x<y\),若 \(x<p\),根据 \(F(x)\) 的凸性让 \(x\) 变为 \(\min(p,y)\) 不劣,若仍然不满足 \(x=y\) 则 \(q<p<y\),那么 \(y\) 移到 \(p\) 即可。若 \(x\ge p\),则 \(y>x\ge p>q\),直接把 \(y\) 移到 \(x\) 即可。所以一定存在 \(x=y\) 的最优解。
有了这个引理,设每个块最后选的值为 \(z_1\le\dots\le z_k\),那么若当前存在两个相邻块满足 \(m(B_i)>m(B_{i+1})\),则根据引理令 \(z_i=z_{i+1}\) 不劣,所以可以直接合并两个块而不失最优性。
有上下界限制
对于有上下界的情况,即要求 \(x_i\in[L_i,R_i]\),那么先对 \(L,R\) 进行前/后缀 \(\max/\min\) 使得 \(L,R\) 不降,然后令 \(\phi_i(x)\) 在 \(x\notin[L_i,R_i]\) 时为 \(0\) 即可,那么只需要正常做,求 \(m(B)\) 的时候如果求得的值在 \([L_i,R_i]\) 外就缩到界里面即可。
例题
P8879
考虑配方成 \(L_2\) 的形式,\(b(b-a)=(b-\frac a2)^2-\frac{a^2}4\),然后套保序回归的模版即可,时间复杂度 \(\mathcal{O}(n)\)。
P7294
配方之后是一个 \(L_2\) 保序回归问题,考虑按 \(y\) 排序动态维护块。相比常规的保序回归,现在额外要求每个值在 \([1,x]\) 之间,那么先不考虑这个限制,加上这个限制后有一个 \(<1\) 的前缀会变成 \(1\),\(>x\) 的后缀会变成 \(x\),中间不变,这个是容易维护的,还有需要取整数的问题,因为是凸的所以取最近的就行。时间复杂度 \(\mathcal{O}(m\log m)\)。

浙公网安备 33010602011771号