資料結構基礎 單調佇列

2021-10-02 07:07:54 字數 1661 閱讀 5603

單調佇列一般是具有單調性的佇列,單調佇列有單調遞增和單調遞減兩種,一般來講,佇列的隊首是整個佇列的最大值或最小值,它的思想也是在決策集合(佇列)中及時排除一定不是最優解的選擇。單調佇列是優化動態規劃的乙個重要手段。

具體實現步驟:

維護單調單調遞增佇列:

若隊列為空,將s[i]從隊尾入隊。

若佇列不為空,將比s[i]大的元素都從隊尾彈出,然後把s[i]入隊。

若佇列不為空且s[i]大於隊尾,則直接從隊尾把s[i]入隊。

例題

最大子序和 ch1201

題目大意:

給定乙個長度為n的整數序列(可能有負數),從中找出一段長度不超過m的連續子串行,使得子串行中所有數的和最大。n,m≤3*105。

思路:

計算「區間和」的問題,一般轉化為「兩個字首和相減」的形式進行求解。我們先求出s[i] 表示序列裡前i項的和,則連續子串行[l,r] 中數的和就等於s[r ]- s[l-1]。那麼原問題可以轉化為:找出兩個位置x,y, 使s[y] - s[x] 最大並且y - x <= m。

首先我們列舉右端點i,當i固定時,問題就變為:找到一乙個左端點」,其中j屬於[i - m, i - 1]並且s[j]最小。

比較一下任意兩個位置 j 和 k ,如果 k < j < i 並且s[k] ≥ s[j],那麼對於所有大於等於i的右端點,k永遠不會成為最優選擇。這是因為不但s[k] 不小於s[j].而且j離i更近,長度更不容易超過m,即j的生存能力比k更強。所以當j出現後, k 就完全是乙個無用的位置。

可以得出結論:

可能成為最優選擇的策略集合一定是乙個「下標位置遞增、對應的字首和s的值也遞增」的序列。我們可以用乙個佇列儲存這個序列。

對每個 i 進行下面3個操作:

判斷隊頭決策與i的距離是否超出m的範圍,若超出則出隊。

.此時隊頭就是右端點為i時,左端點j的最優選擇。

不斷刪除隊尾決策,直到隊尾對應的s值小於s[i]。 然後把i作為乙個新的決策入隊。

**:

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n =

300010

;ll sum[n]

;int q[n]

;int n, m, a;

intmain()

int l =

0, r =0;

ll ans = int_min;

for(

int i =

1; i <= n; i++

) cout << ans << endl;

return0;

}

資料結構 單調棧,單調佇列

乙個單調遞增棧的例子 進棧元素分別為3,4,2,6,4,5,2,3 第i步操作結果1 3進棧3 23出棧,4進棧43 2進棧4 2 42 4出棧,6進棧65 4進棧6 4 64出棧,5進棧 6 57 2進棧6 5 2 82出棧,3進棧 6 5 3 對於乙個元素i 在 尾部 新增元素 while r ...

資料結構之單調佇列

dev.c 資料結構之單調棧 從數學上來講,函式的單調性也可以叫做函式的增減性。當函式f x 的自變數在其定義區間內增大 或減小 時,函式值f x 也隨著增大 或減小 則稱該函式為在該區間上具有單調性。換句話來說,函式的單調性就是在區間內的自變數只增或只減。我們說,數學中函式在一段區間內自變數只增或...

資料結構 單調棧與單調佇列

830.單調棧 154.滑動視窗 79.滑動視窗的最大值 單調棧的應用場景 求最近的最值 單調佇列的應用場景 求滑動視窗內的最值 單調佇列步驟 值得注意的是單調佇列存的是下標,方便判斷隊頭是否滑出視窗 1.判斷隊頭是否滑出視窗 2.判斷完之後那麼隊頭就是滑動視窗的最值,處理題目邏輯 順序不一定在2,...