單調佇列 學習筆記

2022-03-26 10:51:37 字數 1469 閱讀 5384

單調佇列是一種特殊的雙端佇列,其滿足單調性,即內部元素單調遞增或單調遞減。單調佇列可以用陣列模擬,也可以用$stl$中的$deque$實現。

例題 最大子序和

給定乙個長度為$n$的整數序列,從中找出一段長度不超過$m$的連續子串行,使得子串行中所有數的和最大。

$n,m\leq 3*10^5$。

區間和可以轉化成「兩個字首和相減」求解。所以問題轉化為「找出兩個位置$x,y$,使得$s[y]-s[x]$最大且$y-x\leq m$。」

固定右端點$i$,此時要找到乙個左端點$j$,$i-m\leq j\leq i-1$且$s[j]$最小。

比較一下任意兩個位置$j$和$k$。如果$k以上告訴我們,最優選擇的策略集合一定是乙個下標遞增,對應字首和$s$也遞增的乙個序列。

利用單調佇列維護,有3個步驟:

1.判斷隊頭決策與$i$的距離是否超過$m$,若是則出隊。

2.此時隊頭就是最優選擇。

3.不斷刪除隊尾決策直到隊尾值小於$s[i]$。然後將$i$作為新的決策入隊。

**:

int l=1,r=1;q[

1]=0

;for (int i=1;i<=n;i++)

單調佇列優化線性dp

形如$f[i]=max+value$的dp方程,我們可以嘗試用單調佇列優化。

例題 [usaco11open]mowing the lawn g

題目鏈結

狀態:設$f[i][0]$表示以$i$結尾且$i$這個數不選所得的最大效率值;$f[i]i1]$表示選這個數的最大效率值。

不難得出狀態轉移方程:

$f[i][0]=max(f[i-1][0],f[i-1][1])$。

$f[i][1]=max(f[j][0]+sum[i]-sum[j]) (i-k\leq j可以轉化成$f[i][1]=max(f[j][0]-sum[j])+sum[i] (i-k\leq j注意開$long long$。

**:

#include#define int  long long

using

namespace

std;

int f[100005][2

],n,k;

int q[100005],l=1,r=1

;int sum[100005],a[100005

];inline

intread()

while(isdigit(ch))

return x*f;

}signed main()

int l=1,r=1

;

for (int i=1;i<=n;i++)

printf(

"%ld

",max(f[n][0],f[n][1

]));

return0;

}

單調佇列學習筆記

單調佇列學習筆記 by menci 輔助佇列 m 即為單調佇列 luogu p3957 跳房子 noip2017普及組 跳房子 顯然答案有單調性,所以二分答案。判斷時 dp。f i 表示跳前i個格仔,且停在第 i 個格仔最大分數 sc ore i 表示第 i 個格仔的分數。易得轉移方程 f i m ...

單調佇列 學習筆記

q 給定乙個長度為n的序列 可能有負數 從中找出一段長度不超過m的連續子串行,使得其和最大 n 500000 n 500000 n 5000 00 a 對於這題 首先不難想到先求出數列字首和sum 那麼顯然問題的答案就是max i mn sum i minj i m i 1 sum j max n ...

單調佇列和單調棧學習筆記

單調棧 單調棧是指乙個棧內部的元素是具有嚴格單調性的一種資料結構,分為單調遞增棧和單調遞減棧。單調棧有兩個性質 1.滿足從棧頂到棧底的元素具有嚴格的單調性 2.滿足棧的後進先出特性越靠近棧底的元素越早進棧 元素進棧過程 對於乙個單調遞增棧來說 若當前進棧的元素為 a 如果a 棧頂元素則直接將a 進棧...