單調棧 單調佇列

2022-03-19 08:11:46 字數 1208 閱讀 2367

啊學完了來寫個總結吧

顧名思義,單調,就是指色彩單一某乙個容器裡面的元素都是遞增或遞減的,而單調棧和單調佇列就是這個容器。

單調棧:

單調棧模板

其他的我就不說了,講下為什麼單調棧是從後往前掃瞄:當我們在判斷乙個數後面第乙個比它大的數時,前提是後面的數已經被處理了,所以我們要從後往前掃瞄。

我做了兩種做法,乙個stl的,乙個手寫的。

stl:

#include using namespace std;

int n;

int ans[3000010] , a[3000010];

stackq;

inline int read()

int main()

for(int i = 1; i <= n; i++) printf("%d " , ans[i]);

return 0;

}

手寫:

#include using namespace std;

int n , t = 0;

int ans[3000010] , a[3000010] , s[3000010];

stackq;

inline int read()

int main()

for(int i = 1; i <= n; i++) printf("%d " , ans[i]);

return 0;

}

單調佇列

單調佇列模板

直接看**吧沒啥好講的很好理解的qwq(只有手寫噠,如想用stl,需要使用stl裡面的雙端佇列哦)。

code:

#include using namespace std;

int n , k;

int a[1000010] , q[2000010];

int s = 1 , e = 0;

int main()

cout << a[q[s]] << endl;

s = 1 , e = 0;

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

cout << a[q[s]] << endl;

return 0;

}

最後提醒一句,手寫的比stl的會快很多,考場上遇到單調棧/佇列盡量手寫吧。

單調棧,單調佇列

大多數借鑑了 單調佇列是什麼呢?可以直接從問題開始來展開。poj 2823 給定乙個數列,從左至右輸出每個長度為m的數列段內的最小數和最大數。數列長度 n 106,m n 我們知道,解法 在暴力列舉的過程中,有乙個地方是重複比較了,就是在找當前的f i 的時候,i的前面其它m 1個數在算f i 1 ...

單調棧 單調佇列

單調棧 單調佇列是在棧和佇列的基礎上加上單調結構的資料結構。如果乙個元素入棧或入隊,他會檢查之前的元素,如果之前的元素不可能是答案的解,那麼就彈出元素,使得當前元素入棧或入隊。leetcode 239 滑動視窗最大值 此題是單調佇列,每次遇到乙個元素,一直從隊尾彈出,直到隊尾元素大於該元素為止。還需...

單調棧 單調佇列

最近打了三場比賽瘋狂碰到單調棧和單調佇列的題目,第一,二兩場每場各乙個單調棧,第三場就碰到單調佇列了。於是乎就查各種部落格,找單調棧,單調佇列的模板題去做,搞著搞著發現其實這兩個其實是一回事,只不過利用了容器內元素單調的不同特性,用來加速處理不同的問題。單調棧解決的是以某個值為最小 最大 值的最大區...