特殊情況下可能可以使用貪心或 DP 維護分段函數解決,這裏不再展開。
4 一般問題的算法
整體二分也不用介紹了。
4.2 新問題的構造
在 \(L_p\) 基礎上加入另一個限制,得到 \(S=\{a,b\}(a<b)\) 問題:滿足原問題所有限制的同時,還滿足 \(a\le f_i\le b\) ,最小化迴歸代價。
4.3 \(p=1\) 的情況
\(p=1\) 之所以特殊,是因爲一個點集 \(U\) 的 \(L_p\) 均值(在不考慮最小的情況下)可能是一個區間。但是另外一個性質是存在一個最優解滿足所有 \(f\) 都在 \(\{y_i\}\) 中,並且移動一些 \(f\) 時帶來的額外代價是簡單的一次函數。
然後是一個引理:在 \(L_1\) 問題中,如果
- 任意 \(y_i\) 不在區間 \((a,b)\) 中,且
- 存在一個最優解序列 \(z\) 滿足 \(z_i\) 均不在 \((a,b)\) 中(好像很顯然),且
- \(z^S\) 爲 \(S\) 問題的一組最優解
那麼原問題一定存在一組最優解 \(z\) ,使得 \(z\) 向 \(S\) 取整能得到 \(z^S\) 。
我會感性理解(((
然後就可以整體二分所有 \(z\) 的取值。二分到 \(y_l,y_r\) 時,計算 \(S=\{y_{mid},y_{mid+1}\}\) 問題的最優解,以此確定現在這些 \(z\) 要被劃分進 \(y_{[l,mid]}\) 還是 \(y_{[mid+1,r]}\) 。
4.4 \(1<p<\infty\) 的情況
引理 4.2 :可以證明任意集合 \(U\) 的 \(L_p\) 均值唯一,且代價函數在 \(<L_p\) 時遞減, \(>L_p\) 時遞增。
取一個極小的區間,然後就可以套用 \(p=1\) 的證明方法。不是很想看具體證明過程。
5 特殊偏序結構上的優化
5.1 樹上問題
直接套用整體二分方法,然後跑樹形 DP ,即可得到 \(O(n\log n)\) 做法,看起來顯然比維護分段函數好得多。
仙人掌也可以這麼做。
5.2 多維偏序
定義: \(d\) 維偏序,就是點在 \(d\) 維空間裏,有 \((a_1,a_2,\cdots,a_d)\le (b_1,b_2,\cdots,c_d)\) 當且僅當 \(\forall 1\le i\le d,a_i\le b_i\) 。
這裏其實是偏序關係恰好爲多維偏序,比如像下面這題:
顯然在整體二分的任意時刻,每行剩下的點都是一個區間,並且這一次也只會切成兩個區間,所以隨便 DP 即可。
更高維的情況可能也不是很好做吧。
6 \(L_{\infty}\) 問題的算法與拓展
6.1 簡單的二分法
無腦二分答案,得到每個變量的一個取值範圍,然後在 DAG 上無腦 DP 即可。
6.2 問題的拓展
出題人一拍腦袋,讓你在滿足所有限制的情況下對每個前綴的 \(\max\) 求最小值,即對於 \(k\) ,令 \(w_i=0,i>k\) ,然後求最小值。但是現在增加了條件, \(v_i\le v_j\) 當且僅當 \(i\le j\) 。
此時就不能二分了,我們來找一個神奇性質。
此時顯然有答案 \(\ge \max\limits_{i,j} \{mean\_err(v_i,v_j)\}\) ,然後構造這麼一組解。
對於 \(v_k\) ,選擇 \(mean\_err(v_i,v_j)\) 最大的一組 \(v_i,v_j(v_i\le v_k\le v_j)\) ,令 \(f_k=mean(v_i,v_j)\) (如果都是 0 那就直接選 \(y_k\) ?)。然後分三步證明這樣構造的正確性。
如果有另一組 \(v_{i'},v_{j'}\) 的 \(mean\_err\) 與這組相等,那麼可以證明它們的 \(mean\) 也相等。否則如果 \(mean(v_{i'},v_{j'})\) 更大,即交點在右邊,那麼可以發現一組更大的 \(mean\_err\) 。
然後證明 \(err(v_k,mean(v_i,v_j))\) 不超過 \(mean\_err(v_i,v_j)\) :如果超過了,那麼選擇 \((v_i,v_k)\) 或 \((v_k,v_j)\) 得到的 \(mean\_err\) 會更大。
最後證明這樣構造滿足偏序關係。考慮偏序關係 \(v_a\le v_b\) ,設 \(C_a,D_a\) 分別表示 \(v_e\le v_a\) 的 \(err\) 函數的左半支的射線集合,和 \(v_e\ge v_a\) 的 \(err\) 函數的右半支的射線集合, \(C_b,D_b\) 同理。那麼 \(f_a\) 取的值就是 \(C_a,D_a\) 的所有交點中 \(y\) 座標最大的那個點的 \(x\) 座標。考慮從 \(a\) 推到 \(b\) ,會使得 \(C\) 中加入一些射線, \(D\) 中刪除一些射線。分別考慮 \(C,D\) 組成的下凸殼,給 \(C\) 加一條射線的時候最大 \(y\) 座標不降,那麼 \(x\) 座標也不降;給 \(D\) 刪一條射線同理。
構造完成。於是證明了答案可以取到下界。
回到例題,那就可以設 \(pre(v_i)=\max\{mean\_error(v_{j},v_i)\mid j\le i)\}\) ,然後答案就是前綴 \(\max\) 。無腦做已經得到 \(O(n^2)\) 的複雜度了。維護之前所有函數的左半支的凸殼,然後求這個函數的右半支與凸殼的交點,即可做到 \(O(n\log n)\) 。
注意如果 DAG 的形式並沒有 \(v_i\le v_j\Leftrightarrow i\le j\) 這麼好看,那還是要 \(O(n^2)\) 的複雜度。