《浅谈保序回归问题》学习笔记
一、偏序关系
设 $\preceq $ 是集合 \(S\) 上的一个二元关系,若 \(R\) 满足:
- 自反性:\(\forall x \in S\),\(x \preceq x\) ;
- 反对称性:\(\forall x, y \in S\), \(x \preceq y, y \preceq x \Rightarrow x = y\);
- 传递性:\(\forall x, y, z \in S\),\(x \preceq y, y \preceq z \Rightarrow x \preceq z\)。
二、问题描述
给定正整数 \(p\) 和一个偏序关系(DAG),每个点有权值 \((w_i, y_i)\),你需要给每个点附上一个权值 \(f_i\),使得 \(\forall x, y, s.t. x \preceq y\),\(f_x \leq f_y\),最小化回归代价:
特别地,当 \(p \to \infty\) 时,回归代价为 \(\max_{i\in S}w_i|f_i - y_i|\)。
对于一个给定的 \(p\),称上面的问题是 \(L_p\) 问题。
三、\(L_p\) 均值及其性质
定义 \(L_p\) 均值为使得 \(\sum_{i\in S}w_i|k - y_i|^p\) 最小的 \(k\),即 \(f_i\) 均相同时的答案,可以对目标式求导,导数为 0 即是答案。
当 \(p = 1\) 时,\(L_1\) 均值是大家幼儿园都知道的带权中位数;当 \(p = 2\) 时,是大家小学就耳熟能详的带权平均数,即 \((\sum\limits_{i \in S}w_iy_i)/(\sum\limits_{i \in S}w_i)\) 。
当 \(p > 1\) 时,\(L_p\) 均值唯一。且对于任意一组 \(L_p\) 问题的最优解 \(\{f_i\}\),存在 \(S\) 的一个子集 \(T\),使得 \(T\) 的 \(L_p\) 均值为 \(f_i\)。
四、一般问题的算法
在 \(L_p\) 问题的基础上而外加入限制 \(S = \{a, b\}(a < b)\),使得 \(\forall i, a \leq f_i \leq b\)。
\(p = 1\) 的情况
当 \(p = 1\) 时,一个点集 \(U\) 的 \(L_p\) 均值可能是一段区间,同时显然存在一个最优解使得 \(f_i \in \{y_i\}\) 中,移动 \(f_i\) 的改变量是一些一次函数。
引理 1 :在 \(L_1\) 问题中,若存在区间 \((a, b)\) 使得所有 \(y_i\) 不在 \((a, b)\),且存在一组最优解 \(z_i\) 使得 \(z_i\) 也不在 \((a, b)\)。定义一个集合对区间 \(S = (a,b)\) 取整为 \(z^S\):若 \(z_i \leq a\),\(z_i = a\);若 \(z_i \geq b\),\(z_i = b\);否则不变。则 \(z^S\) 为 \(S\) 问题的一组最优解。
根据引理,可以进行整体二分。二分到 \([l, r]\) 时,计算 \(S = (y_{mid}, y_{mid+1})\) 的最优解,根据 \(z_i\) 的取值情况继续划分成 \([l, mid]\) 和 \([mid+1,r]\) 的两个子问题。
\(1 < p <\infty\) 的情况
当 \(1 <p < \infty\),其 \(L_p\) 均值唯一,且代价函数在 \(< L_p\) 时递减,\(>L_p\) 时递增。
整体二分,找一个极小的 $\epsilon $ 使得任意 \(y_i, f_i\) 不在 \((mid, mid+\epsilon)\) 中,根据引理,每个 \(f_i\) 只能等于 \(mid\) 或 $mid+\epsilon $。 若 \(U\) 中任意一点选择了 $mid+\epsilon $,则所有满足 \(x \in U, i \preceq x\) 的点都只能选择 \(mid+\epsilon\),等价于闭合子图模型。钦定所有点先选择 \(mid\),若选择 $mid+\epsilon $ 的改变量为 \(w_i[(mid+\epsilon)^p - y_i]-w_i[mid^p - y_i]\) ,然后跑最小权闭合子图即可。
但可能精度误差较大。此时可以将 \(mid\) 看做变量 \(x\),两边同时除以 \(\epsilon\),变成 \(x\) 在 \(mid\) 时的导数,此时不会出现精度误差。
特殊情况的解法
-
对于 \(L_2\) 问题,若还要求 \(f_i\) 单调不降,则在最优解中,若 \(y_i > y_{i+1}\),则 \(f_i = f_{i+1}\)。
可以简单调整法证明。因此,当 \(y_i > y_{i+1}\) 时,可以将 \(i\) 和 \(i+1\) 看做一个点,此时新的 \(y'\) 为他们的 \(L_2\) 均值。\((S_1,y_1, w_1) +(S_2, y_2, w_2) = (S_1 \cup S_2, \dfrac{y_1w_1+y_2w_2}{w_1+w_2}, w_1+w_2)\)。
当 $k $ 不为 2 时同样成立,只需要把 \(L_2\) 均值改为 \(L_k\) 均值即可。
-
对于树上的情况,可以 DP 维护分段函数,也可以直接整体二分后跑树形 DP。
-
对于 \(L_p, p = \infty\) 问题,显然可以二分,变成每个数有取值范围,即可在 DAG 上 dp 求解答案。
五、\(L_{\infty}\) 问题及其扩展
问题描述:大小为 \(n\) 的点集,对于 \(\forall i, j(i < j)\) 均有 \(v_i \preceq v_j\),求一组代价函数 \(f_i\),满足 \(\forall i, j(i< j)\) 均有 \(f_i \leq f_j\),对于每一个前缀 \([1, k]\),最小化 \(\max_{i = 1}^{k}w_i|y_i - f_i|\)。
六.例题
CF1615H Reindeer Games
\(L_1\) 保序回归板子。显然每个点取值只会在初始 \(a_i\) 集合中,二分 \(mid\) 后,对每个 \(i \in [l, r]\) 计算取 \(a_{mid}\) 和 \(a_{mid+1}\) 的差值,然后网络流。
[省选联考 2020 A 卷] 魔法商店
将最大最小看做偏序,以最大值为例,对每个钦定在最大的元素,计算删去它后剩下能加入线性基中元素 \(z\),满足偏序 \(a_z \leq a_x\)。
【2018雅礼集训7.10】序列
显然可以直接建立偏序关系,但边数太多,直接网络流无法通过。
也许可以线段树优化建图优化?但考虑偏序是最大最小,可以通过 DP 求解。
将选 \(a_{mid}\)看做 0,\(a_{mid+1}\) 看做 1.对于 $k $ 是 \([l, r]\) 最大值的限制,当 \(b_k = 0\) 时,\([l, r]\) 都要选 0;对于 \(k\) 是 \([l, r]\) 最小值的限制,当 \(b_k = 1\) 时,\([l, r]\) 都要选 1。
最后询问区间取值一定是 01 交替的若干段的形式,于是我们可以 DP:设 \(dp_{i, 0 / 1}\) 表示考虑前 \(i\) 个元素,且 \(i\) 选 0 / 1 的最小代价。上面的两个限制可以转化为:
- 当 \([j, i]\) 全部选 0 时,对于所有 \(k \in [j, i]\) 的最大值限制,\(j \leq l_k\),\(i \geq r_k\)。
- 当 \([j, i]\) 全部选 1 时,对于所有 \(k \in [j, i]\) 的最小值限制,\(j \leq l_k, i \geq r_k\)。
因此直接 \(O(n^2)\) dp 即可,需要记录决策点得到每个点的取值。在整体二分过程中,只保留有用的限制。
【USACO 2021.1 Platinum】Minimum Cost Paths
由于 \(m\) 比较小,假设当 \(y = i\) 时,\(x = a_i\),满足 \(a_1 = 1, a_m \leq x\),则代价为:$\sum\limits_{i = 2}^{y}(c_{i - 1} \times (a_{i} - a_{i - 1})+a_{i}^2)+(x - a_m) \times c_{m} $。
化简:\(x \times c_y - c_1 + \sum\limits_{i = 2}^y a_i^2+a_i(c_{i - 1} - c_i)\)
\(c_{i - 1} - c_i\) 为常数,可配成二次方程形式:\((a_i + \dfrac{c_{i - 1} - c_i}{2})^2 - \dfrac{(c_{i - 1} - c_i)^2}4\)。
因此:\(ans = x\times c_y - c_1 + \sum\limits_{i = 2}^y(a_i+\dfrac{c_{i - 1} - c_i}2)^2 - (\sum\limits_{i = 2}^y \dfrac{(c_{i - 1} - c_i)^2}4)\) 。
对于前面的,显然是 \(L_2\) 问题在 \(a_i \leq a_{i+1}\) 的特殊情况,可以维护单调栈。但会出现两个问题:
- 要求 \(a_i\) 为整数,只用每次把均值四舍五入即可。
- 可能出现 \(a_1 < 1, a_y > x\) 的情况,我们可以根据引理 1,直接将 \(a_i < 1\) 的变为 1,\(a_i > x\) 变成 \(x\)。可以二分找到端点然后前缀和更改。
【HNOI2019】序列
当没有修改时,显然可以直接套用单调栈做法。否则,我们考虑将前缀信息和后缀信息进行合并得到更改后的答案。
先预处理出所有前后缀答案并利用可持久化线段树进行维护,线段树的每个下标保存第 \(i\) 段的信息(左右端点,均值等)。注意到 \((\sum\limits_{i = 1}^n(a_i - \overline a)^2) = (\sum\limits_{i = 1}^na_i^2) - \dfrac 1 n (\sum\limits_{i = 1}^na_i)^2\) ,因此只用维护一次方二次方和即可得到一段区间的 \(L_p\) 均值。设 \(pre_{x}\) 表示 \([1, x]\) 的单调栈信息,\(suf_x\) 表示 \([x, n]\) 的单调栈信息。
对于将 \(a_x\) 更改为 \(y\) 的操作,我们想要将 \(x\) 与 \(pre_{x - 1}\) 和 \(suf_{x+1}\) 合并,且合并后得到区间长度越小越好,同时注意到若合并的端点不是原来 \(pre_{x - 1}\),\(suf_{x+1}\) 的端点一定不优,这是因为一个平均值为 \(v\) 的段,其所有后缀的平均值一定 \(<v\)。若 \(x\) 所在区间部分包含 \([l, r]\) ,则与 \(x\) 合并的那一段 \(<v\),而 \(x\) 的平均值 $\geq $ \([l, p]\),相当于是 \([p+1, r]\) 这一段 “拖累”了 \(x\) 所处段。
根据上面的性质,我们可以二分。我们可以先二分 \(suf_{x+1}\) 中区间右端点 \(R\),再二分最大的 \(L \leq x\) 满足 \([L,R]\) 平均值 $\geq $ \(L\) 段删去 \(L\) 及其之后的元素的平均值。且 \([L, R] \geq R\) 段平均值。注意到 \(L\) 越小一定越合法,因此可以直接在 \(pre_{x - 1}\) 上二分。
二分的具体过程是:对每个节点保存最左的区间和剩下的区间,若当前区间加上剩余区间 $\geq $ 最左区间则合法,递归子树;否则加上整个区间的答案。
时间复杂度 \(O(n\log^2 n)\)。
【2018集训队互测Day2】有向图
保序回归后,变成一个简单的树形 dp,对于基环树枚举第一个点的状态断环成链,计算最小花费的同时记录决策,时间复杂度 \(O(n\log n)\)。