保序回归
给定正整数 \(p\) 、一张点集为 \(V = {v_1, v_2, ..., v_n}\) 、边集 \(E\) ( \(|E| = m\) )的有向无环图 \(G\) ,及代价函数 \((y,w)(∀i,w_i > 0)\) 。如果在 \(G\) 中有 \(v_i\) 到 \(v_j\) 的有向路径,那么就有 \(vi \preceq vj\) 的偏序关系。
求点值序列 \(f\) ,满足 \(∀vi \preceq vj(i, j ∈ [1, n])\) ,均有 \(f_i ≤ f_j\) ,最小化回归代价:
对于相同的 \(p\) ,这一类问题统称为 \(L_p\) 问题。
解决这类问题,需要依靠以下引理:
对于 \(L_p\) 问题,我们创造一个新问题:令所有 \(f_i\) 均在 \(\{l, r\}\) 内选择一个(\(l < r\)),称其为 \(S\) 问题,其最优解假设是 \(z_s = \{f_n\}\),如果原问题的最优解 \(z\) 满足所有 \(f_i\) 均在 \((l, r)\) 外,那么如果 \(z_s\) 内某一个 \(f_i = l\),那么 \(z\) 中 \(f_i \le l\);否则 \(f_i \ge r\)。
在 \(p = 1\) 的时候,最优解中的元素一定都在 \(y_i\) 中;否则,最优解中的元素在最小 \(y_i\) 和最大 \(y_i\) 组成的实数区间中任意分布。
于是我们可以做整体二分,对 \(S\) 问题进行求解,缩小范围,直到达到需要的精度(\(p>1\))或者都固定(\(p=1\))。
考虑 \(S\) 问题,对于一般图,它是一个最大权闭合子图问题。但是我们先看对于树形图或仙人掌,可以树上/仙人掌上 dp 做。
这个 dp 做的时候对于每一个分治区间都会做一次是不好的,但是我们可以每一层放到一起做,考虑每一个元素目前的区间 \([l_i, r_i]\) 是一个分治区间的端点,记录一下,然后考虑 dp 的第二维度记录一下 \(0/1\) 代表它选择 \([l_i, mid_i]\) 还是 \([mid_i + 1, r_i]\)。对于 \(mid\),因为如果 \(mid, mid + 1\) 相同那么就没有意义了,所以我们从 \(l\) 到 \(r\) 遍历一遍,这样找 \(mid\) 并且提前存下来:
for (int hx = l; hx <= r - 1; hx ++) {
if (ord[hx] != ord[hx + 1]) {
mid = hx;
if (hx >= hf)
break;
}
}
时间复杂度是 \(O(n \log n)\)。
对于环,比较好的处理方式是认为只有一条边是非树边,然后剩下的组成一棵树,认为树根是非树边的其中一个端点,然后在状态里面额外记录一个维度表示非树边的另外一个端点选不选。最后考虑答案的时候只需要考虑这一个非树边即可。
任意一条边至多只出现在一条简单回路的无向连通图称为仙人掌。
对于仙人掌,对其建立圆方树,某一个方点代表一个环。边有两种:圆圆和圆方。分别考虑圆点上和方点上要做什么事情。考虑所有限制在方点处处理。从某一个圆点开始 dfs,每一个环先进入的都是某一个圆点,考虑枚举它的取值,然后在方点处合并其他几个儿子。