《決策單調性與四邊形不等式》 - 學習筆記

原本以爲這些都是些簡單 trivial 的東西,並且一直沒見過題,於是一直沒學。直到 UNR D2T3 當頭棒喝,發現自己其實啥也不會。

Itst Orz

學習自 psj APIO2021 講課 《決策單調性與四邊形不等式》。

昨天下午開始學習,在從廣東到浙江的高鐵上寫了這篇 blog ,在宿舍裏完工。希望能夠 NOI2021 rp++;

如有錯誤請直接指出。我覺得我的思維非常不嚴謹……


定義什麼的略過。(沒有課件的可以隨便找個羣友要。)

需要非常注意的一點是,雖然下面經常會提到 \(n\times m\) 的矩陣,但矩陣內的元素都是可以直接計算的,而不需要輸入。所以最後往往真正計算過的元素個數遠小於 \(nm\)

可能需要一點時間才能適應這個想法。(或者是我太菜。)

另外,有的時候可能會把矩陣中的一些位置刪掉,即強制不考慮這些位置。此時,只要剩下的位置滿足四邊形不等式(注意四邊形不等式的條件僅僅是 \(i<j,u<v\) ,而對 \(j,u\) 沒有限制),並且每一列剩下的位置是一個區間,並且這個區間的左右端點都單調遞增,那麼仍然可以證明行最小值位置的單調性。

決策單調性的決策點計算

分治

拿出中間的一行,得到這一行的 \(\min\) ,然後切成兩邊。

複雜度 \(O(m\log n)\)

在原先的那篇 blog 裏有較詳細的介紹,這裏不再贅述。

SMAWK

\(O(n+m)\) 計算完全單調矩陣的行最小值。課件中寫的是 \(O(n+m(1+\max(0,\log{n\over m})))\) ,但是感覺這和線性確實沒有區別?

思路很簡單:行最小值的位置單調,那麼我們只要確定所有偶數行的最小值位置,就可以 \(O(m)\) 把奇數行的最小值位置全部推出來。

但是如果無腦寫那麼複雜度是 \(O(n+m\log n)\) ,不行。

考慮複雜度瓶頸在哪。每次會把 \(n\) 折半,但是 \(m\) 並沒有變化。當 \(n\) 很小的時候還有這麼大的 \(m\) 就很浪費了。

所以引入 reduce 操作:給一個 \(n\times m\) 的完全單調矩陣,返回一個 \(n\times \min(n,m)\) 的子矩陣,包含所有行最小值。

只要能進行 reduce 操作,那麼在 \(n\) 折半的時候 \(m\) 同樣會變小,所以複雜度就變爲上面那個樣子了。

reduce 操作:

從左往右掃,維護所有可能包含行最小值的列。假設現在有 \(k\) 列,分別對應 \(1\sim k\) 行的最小值。

因爲這樣不會影響正確性,所以可以暫時認爲對於 \(1\le i\le k,j>i\) ,有 \(A_{j,i}=+\infty\) ,即不考慮下三角的元素。

現在考慮第 \(k+1\) 列,比較 \(A_{k,k},A_{k,k+1}\)

  1. 如果 \(A_{k,k}< A_{k,k+1}\) ,那麼第 \(k\) 列暫時沒啥問題。如果 \(k\ne n\) 則把第 \(k+1\) 列加入, \(k\gets k+1\) ;否則第 \(k+1\) 列毫無用處,直接刪掉。
  2. 否則第 \(k\) 列沒有用,把第 \(k\) 列刪除, \(k\gets k-1\)

有了 reduce 操作之後就可以每次讓 \(n,m\) 同時折半了。

Wilber 算法

SMAWK 是離線算法,而 Wilber 算法可以處理某些在線的情況:

\[f_i=\min_{1\le j<i} f_j+w_{j,i} \]

從左往右做,維護 \(r,c\) ,表示 \(1\le i\le c\)\(f\) 已經確定,且 \(f_i\) 的轉移點至少是 \(r\)

暫時不管後面未求出的 \(f\) ,直接用 \([r,c]\) 去估計後方的 \(f\) 。設 \(p=\min(n,c+(c-r+1))\) ,那麼設 \(g_{[c+1,p]}\) 表示用 \([r,c]\) 得到的估計值。估計值用 SMAWK 算法得出。

\(g\) 當然是不夠精確的,所以用 \(g_{[c+1,p]}\) 再次估計 \([c+1,p]\)\(f\) ,設兩次估計值的 \(\max\)\(h\)

如果 \([c+1,p]\) 中都有 \(g=h\) ,那麼說明這一段 \(f=g\) ,直接令 \(c=p\)

否則,找到第一個 \(t\) 使得 \(g_t\ne h_t\) ,則 \([c+1,t]\)\(f=h\) ,且 \(t\) 的轉移點 \(>c\) 。令 \(c'=t,r'=c+1\)

容易發現,我們每花 \(O(1)\) 的時間,就會讓 \(c\)\(c-r+1\) 增加 \(O(1)\) ,或者讓 \(c-r+1\) 減小 \(O(1)\) 。所以總複雜度 \(O(n)\)

Eppstein 算法

Wilber 算法在做“交錯動態規劃”時並不能使用:

\[\begin{aligned} f_{i} &=\min _{1 \leq j<i} g_{j}+w_{j, i} \\ g_{i} &=\min _{1 \leq j<i} f_{j}+w_{j, i}^{\prime} \end{aligned} \]

原因在於 \(f,g\) 並不同步。可能 \(f\) 在第一次估計時就給出了正確值,但發現 \(g\) 在第二次估計時才估計正確,那麼 \(f\) 的轉移點可能還是很靠前,就比較麻煩。

然後就有 Eppstein 算法。

我們在下面主要考慮求 \(f\) ,但要注意 \(g\) 的計算也在同步進行。\(f,g\)\(r,c,E\) 並不相同。

仍然維護 \(r,c\) ,表示 \(c\) 之後的可能從 \([r,c]\) 轉移過來。但是另外記一個數組 \(E\)\(E_i\) 表示 \([1,c-1)\)\(i\) 的貢獻。

\(p=\min(n,c+(c-r+1))\) ,然後還是用 \([r,c]\)\(g\) 估計 \([c+1,p]\)\(f\) ,並與 \(E_{[c+1,p]}\)\(\min\) ,得到 \(h\)

然後對於 \(c<i\le p\) 計算 \(v_i=\max_{i<j\le p}h_j-w_{i,j}\) ,表示如果 \(g_i< v_i\) 則會出現錯誤估計。

\(c+1\) 開始往右掃,設現在掃到 \(k\)

先令 \(f_k=h_k\) 。如果 \(g_k\ge v_k\) 那麼無事發生,可以繼續往後掃。

【否則用 \(h\) 更新 \(E_{[k+1,p]}\) ,並令 \(r'=c+1,c'=k\) 。】

這是很妙的一步:我們已經知道 \((k,p]\) 中有一個位置的轉移點是 \(k\) ,所以 \((p,n]\) 的轉移點都會在 \(k\) 之後。所以 \([r,k)\) 只能對 \((k,p]\) 產生貢獻,記在 \(E\) 裏面即可。

複雜度 \(O(n)\)

二維決策單調性

最優搜索樹問題

俗稱石子合併

轉移方程

\[f_{i, j}= \begin{cases}0, & i \geq j \\ w_{i, j}+\min _{i \leq k<j} f_{i, k}+f_{k+1, j} & i<j\end{cases} \]

其中 \(w_{i,j}\) 滿足四邊形不等式,同時滿足 \(l\le l'\le r'\le r\) 時有 \(w_{l,r}\ge w_{l',r'}\)

如果能證明 \(f_{i,j}\) 滿足四邊形不等式,那麼就可以用經典方法把轉移優化到 \(O(n^2)\)

\(f_{i,j}\) 的最優轉移點(多個取最大的)是 \(K_{i,j}\)\(f_{i,j}\)\(k=y\) 時的轉移值爲 \(f_{i,j,y}\)

考慮 \(i\le j\le i'\le j'\)\(i'<j\) 的情況因爲文章開始提到的原因可以忽略),我們希望證明 \(f_{i,i'}+f_{j,j'}\le f_{i,j'}+f_{j,i'}\)

  1. 如果 \(i=j\)\(i'=j'\) 那麼直接得證。

  2. 如果 \(j=i'\) ,那麼其實是希望證明 \(f_{l,x}+f_{x,r}\le f_{l,r},l<x<r\) 。設 \(y=K_{l,r}\) ,並不妨假設 \(y< x\) 。此時直接把 \(f_{l,r}\) 爆拆成

    \[f_{l,r}=w_{l,r}+f_{l,y}+f_{y+1,r}\ge w_{l,r}+f_{l,y}+f_{y+1,x}+f_{x,r}\ge f_{l,x}+f_{x,r} \]

  3. 否則, \(i<j<i'<j'\) 。先把 \(w_{i,j'}+w_{j,i'}\) 放縮爲 \(\ge w_{i,i'}+w_{j,j'}\) ,設 \(x=K_{j,i'},y=K_{i,j'}\) ,並不妨假設 \(x\le y\) 。此時可以把 \(f_{j,x}+f_{i,y}\) 放成 \(f_{i,x}+f_{j,y}\) ,然後和另外兩個組合起來。

然後爲了優化 DP ,需要證明 \(K_{i,j-1}\le K_{i,j}\le K_{i+1,j}\) 。固定 \(i\) ,設 \(a_{j,k}=f_{i,j,k}\) ,那麼 \(a\) 是蒙日陣,且 \(K_{i,j}=\min_j a\) ,所以有單調性,左邊的不等式得證。右邊同理。

多叉樹擴展

從二叉樹變成 \(k\) 叉樹,即把 1 個分界點變成 \(k-1\) 個分界點。

\(O(kn^2)\) 的做法非常顯然。

注意到可以關於 \(k\) 這一維倍增,優化爲 \(O(n^2\log k)\)

決策單調性最短路問題

DAG ,邊權爲 \(w_{i,j}\) ,求 1 到 \(n\) 經過恰好 \(k\) 條邊的最短路。

有簡單的轉移式:

\[f_{i, j}=\min _{1 \leq k<j} f_{i-1, k}+w_{k, j} \]

\(w\) 沒有性質的時候就沒什麼辦法了。否則這個轉移可以看做是對每個 \(j\) 求第 \(j\) 列的最小值,可以用 SMAWK 優化,總複雜度 \(O(nk)\)

但是在後面可以發現更好的性質。

XIX Open Cup Grand Prix of Zhejiang I. 環上郵局

\(n\) 個點放在一個長度爲 \(L\) 的環上,把它們分成恰好 \(k\) 段,每段的代價是所有點到中位數的距離。求最小代價並輸出方案。\(n,k\le 2.5\times 10^5\)

首先可以分析出代價函數具有四邊形不等式:只需要按照內層中位數和外層中位數的位置關係分類討論一下即可證明。

於是枚舉在哪裏斷環爲鏈,可以做到 \(O(n^2k)\)

進一步優化需要不少觀察。

最短路問題與凸性

答案關於 \(K\) 下凸。

\(f(K)\)\(K\) 的答案,這裏直接證明對於 \(1\le s<r<t\le n-1,f(s)+f(t)\ge f(r)+f(s+t-r)\)

證明其實不難:把 \(f(s),f(t)\) 對應的路徑畫出來,一定可以找到 \(f(t)\) 的一條邊 \((x,y)\)\(f(s)\) 的一條邊 \((u,v)\) 包含,即 \(u\le x<y\le v\) ,並且切換爲 \((u,y),(x,v)\) 之後路徑長度恰好變爲 \(r,s+t-r\) 。稍微分析一下可以發現這樣的兩條邊必然存在。

然後直接寫個 wqs 二分就可以求出最小代價。然後用上面這個構造方法就可以構造出恰好 \(K\) 條邊的方案。

複雜度 \(O(n^2\log V)\)

路徑單調性與不交性

上面把 \((x,y),(u,v)\) 切換爲 \((u,y),(x,v)\) 的操作還可以在很多地方運用。

定義一個路徑的字典序:把經過的所有點丟進 \([0,L)\) 的範圍中,再按此時的編號從小到大排序(即比較集合的字典序)。

路徑單調性

定理:\(p_1=x_1,\cdots,x_{k+1}=q_1\)\(p_1\)\(q_1\) 的長度爲 \(k\)字典序最小的最短路;設 \(p_2=y_1,\cdots,y_{k+1}=q_2\)\(p_2\)\(q_2\) 的長度爲 \(k\)字典序最小的最短路。若 \(p_1\le p_2,q_1\le q_2\) ,則有 \(\forall i\in [1,k+1],x_i\le y_i\)

證明:

考慮 \(x_1\le y_1\)\(x_{k+1}\le y_{k+1}\) ,所以如果能找到第一個 \(x_i>y_i\) 的位置,後面一定又可以找到第一個 \(x_j\le y_j\) 的位置。那麼在 \(i\) 處的順序是 \(x_{i-1},y_{i-1},y_i,x_i\) ,而 \(j\) 處的順序則是 \(y_{j-1},x_{j-1},x_j,y_j\) 。分別改成交叉,路徑長度和不變,而字典序發生了奇妙的變化。

路徑不交性

定理:\(x_1,\cdots,x_{p+1}\)\(f(p)\) 對應的字典序最小的最短路;設 \(y_1,\cdots,y_{p+2}\)\(f(p+1)\) 對應的字典序最小的最短路。則有

\[y_1=x_1<y_2\le x_2\le y_3\le \cdots\le x_p\le y_{p+1}\le x_{p+1}=y_{p+2} \]

證明:

\(y_1\sim y_{p+1}\)\(y_2\sim y_{p+2}\) 分別拿出來和 \(x\) 用路徑單調性的結論,即可把 \(y_i\) 限制在 \(x\) 的一個區間裏。

路徑單調性的應用

回到 環上郵局 。

旋轉環使得 \(0\) 處有一個點,從這裏斷開並倍長,跑一個 \(0\to L\) 的最小字典序 \(f(k)\) ,設路徑是 \(0=x_1,\cdots,x_{k+1}=L\)

考慮全局最小字典序 \(f(k)\) ,設爲 \(y_1,\cdots,y_{k+1}=y_1+L\) ,其中 \(0\le y_1,\cdots,y_k<L\)

由路徑單調性,直接得到 \(y_i\ge x_i\) 。而截取 \(y_1,\cdots ,y_k\)\(x_2,\cdots,x_{k+1}\) 用路徑單調性,應該可以得到 \(y_i\le x_{i+1}\)

於是證明了 \(x\) 分成的每一段中恰好有一個 \(y\) 的點。因爲一共有 \(k\) 段,所以段中點數最少的只有 \(n/k\) 個,可以只枚舉這 \(n/k\) 個點的位置斷環爲鏈。於是複雜度被優化到 \(O(n^2)\)

進一步分析

其實到這裏已經有點暈了,因爲有點時候真的不太確定某個東西是不是最小字典序……

考慮 \(y_1\) 往右移動的時候(這時候 \(y\) 不一定是最優解),用路徑單調性兩個方向分析一下什麼的,大概可以分析出每個 \(y_i\) 都在往右移動,並且仍然在 \(x\) 標出的段裏。

那麼對第一個區間分治,每次拿出中間的 \(y\) ,求出此時的最優解,然後把每一段都劃分成兩邊……?

我最終第一個區間的每一個位置都還是要作爲起點算一次,每次至少 \(O(k)\) ,所以這樣還是 \(O(nk)\)

但是解決方法也很簡單:把只有 \(n/k\) 的那個段拿出來做分治,此時複雜度就變成……?

反正是 \(O(n\text{ poly}(\log))\) ,不想分析了。

四邊形不等式的其他應用

連續子矩陣最小值查詢

給出一個 \(n\times n\) 的蒙日陣,每個元素可以 \(O(1)\) 計算。\(q\) 次詢問,每次問一個 \([l_1,r_1]\times [l_2,r_2]\) 矩形的最小值。

先分析 \(l_2=r_2\) ,即只詢問一列的情況。對行建立線段樹,對於一段行區間,每一列對應的最小值位置單調,並且可以被劃分成 \(O(len)\) 個區間。記錄這些區間,合併線段樹兩個子節點的時候二分分界點即可。這樣預處理複雜度 \(O(n\log n)\) ,詢問單次用分散層疊做到 \(O(\log n)\)

把矩陣轉置之後對一行的詢問也可以 \(O(\log n)\) 實現。

然後 \(l_2\ne r_2\) 的情況其實差不多,區間 \([l_2,r_2]\) 會對應 \(O(len)\) 個區間中的一些,以及一個前綴和一個後綴。前後綴暴力詢問,完整的區間用樹套樹維護即可。

UOJ672

把點在 \([1,2n]\) 中編號。

對於 \(u<v<x<y<u+n\) ,因爲交叉的性質,所以有 \(dis(u,x)+dis(v,y)\ge dis(u,y)+dis(v,x)\)

然後考慮標一些奇怪的值使得 \(v\ge x\)\(y\ge u+n\) 的時候這個性質也成立。

對於 \(a,b\) ,如果 \(a\ge b\) 或者 \(a+n\le b\)\(dis(a,b)=-\infty\) 。相當於對於一個 \(1\le a\le n\) ,只有 \((a,a+n)\) 中的值是有用的。

只保留這個區間之後仍然可以表示出兩個點的 \(dis\)

雖然此時這個矩陣仍然不太滿足四邊形不等式(多個條件不合法的時候還是會暴斃),但是足夠證明最大值位置的單調性了。

設現在的 \(dp\) 數組是 \(f_{i,x}\) ,其中 \(1\le x\le n\) 。那麼給第 \(x\) 行加上 \(f_{i,x}\) 。(注意這裏不能用列加,否則後面更新會帶 2 倍常數)

\(f_i\) 轉移到 \(f_{i+1}\) 時,基本上是 \(f_{i+1,x}=f_{i,x}+dis(P_i,P_{i+1})\) 。這就是整體加,很容易搞定。

麻煩一點的是 \(f_{i+1,P_i}\) 需要從 \(f_{i,x}+dis(x,P_{i+1})\) 轉移過來。

這就是第 \(P_{i+1}\) 列和 \(P_{i+1}+n\) 列的最大值,直接得到。然後需要更新第 \(P_i\) 行,求出它們現在控制的區間。

二分往左往右擴展了多長即可。

操作次數 \(4q\log 2n+3q+O(1)\)

挑戰旅行商

給定一個 \(n\times n\) 的蒙日陣 \(A\) ,且保證對角線元素爲 0 ,作爲帶權有向圖的鄰接矩陣。求邊權和最小的哈密頓迴路。 \(n\le 10^6\)

我的垃圾做法:

假設從 \(i\) 跳到了 \(p_i\) ,那麼就有 \(A_{i,p_i}\) 的貢獻。把這些元素所在的位置標出來。

因爲 \(A\) 是蒙日陣,所以任意交換 \(p\) 中的一個逆序對之後邊權和都一定會減小。問題在於交換一個逆序對之後就從一個環變成了兩個環。

但是考慮兩個環可能可以通過再交換一次逆序對變回一個環,所以考慮什麼時候這種情況可以發生。經過分析發現只要兩個環包含的點不是分別對應一個前綴和一個後綴(即 \([1,i]\)\([i+1,n]\) )就一定可以再交換一次合併成一個。

所以一定存在一個最優解 \(p\) 使得任意交換一個逆序對之後都可以被分成 \([1,i],[i+1,n]\) 兩個環。

隨機一些滿足條件的 \(p\) ,看此時對應的路徑長成什麼樣子。發現路徑的樣子必然是從 1 開始編號先上升到 \(n\) ,然後再下降回 1 。“雙調回路”。

題解的牛逼做法:

\(n\) 歸納證明。找出一個不滿足的位置 \(p\)\(pre_p<p,suf_p<p\) ,則把 \(p\) 刪掉,把剩下 \(n-1\) 個點的環調成雙調回路,然後再找一個位置 \(q\) 使得 \(q<p<suf_q\) ,把 \(p\) 塞回去。

用四邊形不等式證明每一步都不會變劣。

然後就只需要求權值和最大的雙調回路了。

直接從左往右 DP ,記錄當前這個位置是在上升還是下降,以及前面第一個與自己狀態不同的點是哪個。無腦轉移 \(O(n^2)\) ,而可以發現這個 DP 和 UOJ672 幾乎一致,所以可以用一樣的方法做到 \(O(n\log n)\)

把狀態精簡一下,設 \(F_i\) 表示 \(i+1\) 在下降, \(i\) 在上升的最小權值, \(G_i\) 對稱。

列一下轉移式,發現是交錯型動態規劃,並且轉移的權值同樣滿足四邊形不等式,於是可以 Eppstein 優化到 \(O(n)\)

不過 UOJ672 並不能這樣優化,因爲給出的點並不順序,所以轉移權值不再滿足四邊形不等式了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章