補上場 CF GLBR 的 H 時發現通過的人的代碼都和官方題解完全不一樣,一問發現是保序回歸板子就來學了。
什么是保序回歸問題
保序回歸問題,說白了就是給你一張有向圖 \(G\),並給定每個點的兩個屬性 \(w_i,y_i\),要求一個序列 \(f_i\),滿足對於圖中所有有向邊 \(u\to v\),均有 \(f_u\le f_v\)。額外給定正整數 \(p\),要求最小化 \(\sum\limits_{i=1}^nw_i|f_i-y_i|^p\)。我們統稱這類問題為 \(L_p\) 問題。
其實我們之前做過的不少與 DAG 上賦值的問題有關的問題都和保序回歸問題有關,譬如 [BalticOI 2004]Sequence 數字序列,便是全序集上的 \(L_1\) 問題。對於那題而言,有維護折線法、單調棧等多種做法,但都不易拓展到更一般的情形。
下面將介紹一種適用於更一般情況的解決保序回歸問題的做法:
前置知識:整體二分
其實思想挺簡單,對於某些數據結構題,解決單組詢問可以二分,但是對每組詢問都二分就顯得效率低下,這時候我們可以把詢問弄在一起二分,即定義函數 solve(l, r, pt)
表示編號在 pt
中的詢問答案在 \([l,r]\) 中,然后用數據結構將狀態調整到 \(mid=\dfrac{l+r}{2}\) 的狀態即可判斷 \(pt\) 中詢問的答案與 \(mid\) 的大小關系。
\(L_1\) 問題的解法
仿照之前整體二分的思路,我們還是考慮用分治的方法逐步確定每個 \(f_i\) 的取值,solve(l, r, pt)
表示我們確定 \(pt\) 中元素的 \(f\) 值都在區間 \([l,r]\) 之間。但是這樣一來問題就出現了,還是記 \(mid=\dfrac{l+r}{2}\),相較於數據結構題中的整體二分,在這個問題中我們不太好直接判斷 \(f_i\) 與 \(mid\) 的關系,於是事情逐漸變得棘手起來。
別急,我們先來挖掘一些性質。我們做出如下定義:
Definition. 定義原問題的 \(S=\{a,b\}(a<b)\) 問題表示在原問題的基礎上,還強制要求所有 \(f_i\in[a,b]\),最小化上式的值。
那么細細思考可以得出如下結論:
Conclusion. 假設 \(\forall i,y_i\notin(a,b)\),\(f’_i\) 為原問題的一組解滿足 \(f’_i\notin(a,b)\),那么我們通過將所有 \(<a\) 的 \(f’_i\) 變成 \(a\),\(>b\) 的 \(f’_i\) 變成 \(b\),也可以得到原問題的 \(S\) 問題的一組解。
針對上面的結論,論文里給出了較為詳細的證明,然而由於本文筆者水平有限,這里只稍微口胡幾句。首先 \(y_i\notin(a,b)\),則意味着滿足條件的 \(f’_i\) 一定存在,因為如果在 \((a,b)\) 中肯定選擇向左或向右平移之一答案不會變劣並且依舊滿足偏序關系,而如果原來的 \(f’_i<a\),則意味着 \(f’_i\) 比較小的情況是最優解,因此在 \(S\) 問題中我們將其平移到 \(a\),否則我們將其平移到 \(b\),這樣肯定是最優策略。
有了這個結論后事情就變得容易多了,我們考慮 \(S=\{mid,mid+1\}\),對於 \(y_i\) 都是整數的情況,顯然存在 \(f_i\) 都是整數的最優策略,也就是說顯然不存在 \(y_i\in(mid,mid+1)\),根據上面的結論,我們求出原問題的 \(S\) 問題的一組解——每個 \(f_i\) 只有兩種可能:\(mid,mid+1\),而對於有向邊 \((u,v)\),\(f_u=mid+1,f_v=mid\) 的情況是不合法的,經典的最大權閉合子圖的模型,網絡流求解。這樣我們即可知道每個 \(f_i\) 與 \(mid\) 的關系。這樣復雜度大概是 \(\log n·\text{網絡流的復雜度}\),根據實測結果(CF1615H),\(n,m\le 1000\) 的數據大概 100 多 ms 就可以出結果。
\(L_p(p\ge 2)\) 問題
其實和 \(L_1\) 問題大差不差,但是由於對於 \(p\ge 2\) 的情況,就算 \(y_i\) 都是整數,也不一定存在 \(f_i\) 都是整數的最優解,(舉例:\(x^2+(y-1)^2,x\ge y\)),這時候我們取正整數集的 \(1\) 為最小單位就不可取了。因此考慮 \(S=\{mid,mid+\epsilon\}\),直接做會有精度問題,但是顯然權值同除 \(\epsilon\) 問題的解不會改變,因此考慮將網絡流建模中的邊權設為 \(w_i|x-y_i|^p\) 在 \(mid^+\) 處的導數。如果要求求精確解那就在實數域上二分即可,否則如果要求整數解,那我們遞歸到 \(r-l=1\) 時,將 \(l,r\) 當作兩種決策,再跑一次最大權閉合子圖即可。
特殊偏序集的 \(L_p\) 問題
不難發現上面算法之所以不能應對特別大(\(10^5\) 級別)的數據,是因為網絡流復雜度太大了,也就是說如果我們能夠高效地對於特殊圖解決其 \(S=\{mid,mid+1\}\) 問題,那么我們也能夠以更優的復雜度解決特殊偏序集的 \(L_p\) 問題。舉幾個常見的例子,全序集 \(S=\{mid,mid+1\}\) 問題的解顯然是一段前綴對應 \(mid\),一段后綴對應 \(mid+1\),直接模擬即可,對於偏序集構成內 / 外向樹的情況可以樹形 DP,仙人掌的情況通過破環成鏈也可以變成樹的情況。總之還是具體情況具體分析。
例題
1. CF1615H Reindeer Games
板子題,直接按照上面的方法整體二分即可。不知道 GLBR 放個這樣的 H 是幾個意思(其實看官方題解感覺是外國人不知道保序回歸這個科技?
2. P6621 [省選聯考 2020 A 卷] 魔法商店
首先有一個結論:一組基是所有基中權值最小的充要條件是那么它肯定比所有與這組基只差一個元素的基權值都要小,因此直接暴力找到所有與其只差一個元素的基,這樣問題可以轉化為 \(L_2\) 問題,按照上面的做法來即可。
3. Topcoder 14634 ExtremeSpanningTrees
和上一題唯一的聯系就是完全一樣(
還是老道理,找到所有與 \(E_1\) 只差一條邊的生成樹 \(T\),設 \(e_1\) 為唯一的在 \(E_1\) 中而不在 \(T\) 中的邊,\(e_2\) 為唯一的在 \(T\) 中而不在 \(E_1\) 中的邊,那么問題的限制可看作 \(e_1\) 的權值 \(\le e_2\) 的權值,對 \(E_2\) 也做一遍類似的操作,然后跑 \(L_1\) 問題即可。
參考文獻:
- 高睿泉《淺談保序回歸問題》,2018 年集訓隊論文。