四邊形優化

凸性優化

凸完全單調性

\(dp_{j} = max(f(i, j))\)

對於所有的轉移點 \(i, j(i < j)\) 滿足

存在一個 \(k\) 使得 

\(\forall x < k, f(i, x) \geq f(j, x)\)

\(\forall x \geq k, f(i, x) \leq f(j, x)\)

白話的說,就是對於所有轉移點 \(i, j(i < j)\) 

都存在一個時刻 \(k\)

使得在接下來從 \(j\) 轉移都會比從 \(i\) 轉移好

另外一個角度

在大部分的時候,式子長這樣

\(dp_j = max(dp_i + cost(i, j))\)

也就是說 \(f(i, j) = dp_i + cost(i, j)\)

通常在題目裡面 \(cost(i, j)\) 會有單調性。

有點難解釋是什麼樣的單調性。

先看例題

tioj 1283

P1

P2

Q1

Q2

P2 從 Q2

轉移比從 Q1

多獲得的

P2 從 Q2

轉移比從Q1少拿到的

整理一下

對於兩個點 \(p1, p2\) 還有轉移來源 \(q1, q2\)

我們定義 \(cost(a, b) := b 從 a 轉移的額外 cost\)

也就是有 \(dp_j = max(dp_i + cost(i, j))\) 的時候只考慮 cost

那單看 cost 的時候

\(p1\) 從 \(q2\) 轉移而不從 \(q1\)時,他的損失就是

\(cost(q2, p1) - cost(q1, p1)\)

 

而同理,對 \(p2\) 也是

\(cost(q2, p2) - cost(q1, p2)\)

整理一下

定義 \(gain_{p1,q2} = cost(q2, p1) - cost(q1, p1)\)

\(gain_{p2, q2} = cost(q2, p2) - cost(q1, p2)\)

如果 \(gain{p1, q2} < gain{p2, q2}\)

(p1 從 q2 轉移額外獲得的比 p2 從 q2 額外獲得的還要少)

而且 \(p1\) 是從 \(q2\) 轉移,那接下來顯然 \(p2\) 不可能從 \(q1\) 轉移。

所以可以推出有轉移點單調。

同時也有凸完全單調性。

接下來的例題,都可以用這種手法來證明。

符合優超性就會有凸完全單調,但是凸完全單調不保證有優超性。

優化處理方法 1:

維護單調隊列,裡面放轉移來源,同時維護該轉移來源什麼時候會比前一個好

每次有新的來源時 從尾端看

假如 單調隊列 的 back 為 \(X\), 要加進來的是 \(Y\)

那就可以二分搜看 \(Y\) 什麼時候會開始比 \(X\) 還要好。

如果 \(Y\) 超過 \(X\) 的時刻早於 \(X\) 超過 單調隊列 中前一項的時刻,那 \(X\) 就永遠都不會被用到。這時候就把 \(X\) 給丟掉。

 

查詢的時候,只要目前用 單調隊列 中第二項轉移比第一項好,就把第一項丟掉,這樣就做完了 !

 

優化處理方法 2:

分治法

因為我們有轉移點單調,所以可以先給出遞迴式

\(solve(L, R, FL, FR)\) 代表要算出 \([L, R)\) 內的答案,

而且轉移來源只會介於 \([FL, FR)\)

 

那只要每次\(O(FR-FL)\) 找出 \(M = (L+R)/2\) 的轉移來源

並且遞迴下去,每一層的複雜度都是 \(O(N)\) 且 最多\(\text{log}N\) 層
 

總複雜度 \(O(N\text{log}N)\)
可是如果 \(dp\) 為 \(dp_j = dp_i + cost(i, j)\) 的話,就必須套一層 CDQ 。多一個 log ,這題是因為單純轉移點單調,且dp 式沒有用到前一項的 dp 值才可以

例題

TIOJ 1347

給你一個長度 \(N\) 的正整數序列 \(A_1 ∼ A_N\)、

一個長度 \(N − 1\) 的正整數序列\(L_1 ∼ L_{N−1}\) 和兩個正整數 \(K, P\) ,請你將區間分割成若干段,對於每段 \([l, r]\),令總和

\(M = \sum_{i=l}^{r}{A_i}\)

則 \(cost = |M-K |^P\)

且當你把 \(i\) 和 \(i + 1\) 分在同一塊時,也會獲得 \(Li\)

的權重,試問分段後的最小cost 總和。

列出 DP

\(dp_i = min(dp_j + cost(j, i))\)

\(cost(j, i) = \sum_{k=j}^{k<i}{L_k} + A[j, i]^P\)

CF 868F

給你一個長度 \(N\) 的整數序列 \(a_1 ∼ a_N\),請你將區間分割成 \(K\) 段,每段的權重是滿足 \(a_i = a_j\) 的無序數對個數,試問最小權重和。

ARC 67 F

給\(N \times M, (N \leq 5 \times 10^3, M \leq 200)\)二維陣列 \(A_{i,j}\)

求 \(max _{l, r}(\sum_{i = 1}^{M}{\max_{l \leq k \leq r}(A_{k, i}) - (r-l+1))}\)

POI 2014 R3D2 Freight

有個隧道,一次只能容納一台車

隧道的左測入口有 \(N(N\leq10^6)\) 台車,第 \(i\) 台在
時間 \(T_i(T_i \leq 10^9)\) 後才出發。

而且在同一個時間點,不能同時有兩台車進隧道。

已知需要 \(S(S \leq 10^9)\) 單位時間,從隧道頭開到隧道尾。

現在要讓所有車都從隧道左側走到右側,再從右側走到左側。

最後一台車從左邊出來的最早時間為多少?

 

凹性優化

 

凹完全單調性

\(dp_{j} = min(f(i, j))\)

對於所有的轉移點 \(i, j(i < j)\) 滿足

存在一個 \(k\) 使得 

\(\forall x < k, f(i, x) \geq f(j, x)\)

\(\forall x \geq k, f(i, x) \leq f(j, x)\)

白話的說,就是對於所有轉移點 \(i, j(i < j)\) 

都存在一個時刻 \(k\)

使得在接下來從 \(i\) 轉移都會比從 \(j\) 轉移好

 

看起來就是和剛剛恰好相反,這種形式就是

當一個新的轉移來源進來的時候,會先成為最佳轉移點。

不過在某個時刻後,他就會變差,再也用不到。

優化處理方法 :

維護單調隊列,裡面放轉移來源,同時維護該轉移來源什麼時候會比前一個差

每次有新的來源時 從尾端看

假如 單調隊列 的 back 為 \(X\), 要加進來的是 \(Y\)

那就可以二分搜看 \(X\) 什麼時候會開始比 \(Y\) 還要好。

如果 \(X\) 超過 \(Y\) 的時刻早於 deque 中前一項 超過 \(X\)  時刻,那 \(X\) 就永遠都不會被用到。這時候就把 \(X\) 給丟掉。

 

查詢的時候,只要目前用 deque 中倒數第二項轉移比倒數第一項好,就把倒數第一項丟掉,這樣就做完了 !

 

例題

USACO 2019 Feb Mowing

給定\(T, N\) ,在二維平面上有 \(N(N \leq 2 \times 10^5)\) 個黑點 \(X_i, Y_i(X_i, Y_i \leq T\),其他點都是白點

現在要從 \(0, 0\) 走到 \(T, T\) 只能往上或往右

一種經過 \(K\) 個黑點走法的美度為 \(K\)

令 \(P_i\) 為路上經過的第 \(i\) 個黑點

且 \(P_0 = (0,0), P_{K+1} = (T,T)\)

則這個走法的權重為 \(\sum_{i=0}^{K}{area(P_i, P_{i+1})}\)
 

求最美的走法中,最小權重是多少

四邊形優化

By Kevin Zhang

四邊形優化

  • 1,153