單調佇列和單調棧例題

2021-10-04 21:17:51 字數 1172 閱讀 8216

1:單調佇列

/*

給出乙個長度為n的序列和區間長度k

,從左向右對每乙個長度為k的區間詢問最大值和最小值。

思路:對於最小值,考慮維護乙個遞增的雙端佇列,每次入隊時將隊尾比當前入隊元素的全部刪除,每次取隊首並且判斷是否在當前區間內即可

*///@author:hairu,wu

//@from:ahut

#include

#include

using

namespace std;

int n,k;

int a[

100100];

void

solve1()

q.push_back

(i);

//下標入隊

if(i>=k)

cout

]<<

" ";

//輸出滑動視窗內的最小值 }}

}void

solve2()

q.push_back

(i);

//插入

if(i>=k)

cout

]<}int

main()

solve1()

; cout

; cout

}

2:單調棧

//@author:hairu,wu

//@from:ahut

/*題意:有n只奶牛排成一列向右看,每頭奶牛只能看到比自己矮的奶牛,即會被高的奶牛擋住後面,

問共有多少只奶牛能被看到

思路:考慮每頭奶牛能被前面牛看到的次數,也就是從他左邊開始單調遞減的序列的長度,

用單調棧維護即可,包括從左邊到自身,必須是單調遞減的

*/#include

#include

using

namespace std;

intmain()

sum+

=s.size()

;//在未加入此元素的情況下加上左邊被看的次數

s.push

(x);

} cout

}

單調棧與單調佇列簡單例題

poj3250 題意 有n只奶牛排成一列向右看,每頭奶牛只能看到比自己矮的奶牛,即會被高的奶牛擋住後面,問共有多少只奶牛能被看到 思路 考慮每頭奶牛能被前面牛看到的次數,也就是從他左邊開始單調遞減的序列的長度,用單調棧維護即可 include includeusing namespace std c...

棧和佇列 單調佇列 單調棧

講解部落格鏈結 一 單調棧 1 什麼是單調棧?單調棧是指乙個棧內部元素具有嚴格單調性 單調遞增,單調遞減 的一種資料結構。2 單調棧的兩個性質 滿足從棧頂到棧底具有嚴格的單調性 滿足後進先出的特徵,越靠近棧底的元素越早的進棧。3 元素進棧的過程 對於當前進棧元素x 如果x 棧頂元素,x 進棧。否則 ...

單調棧和單調佇列

最近又在重新刷題,又看到了單調棧和單調佇列的題目,發現當時也就是背一背就過了,沒有領會到精髓,這次看了幾位前輩寫的心得,感覺理解深了一些。傳送門 關鍵 用單調佇列來解決問題,一般都是需要得到當前的某個範圍內的最小值或最大值。就比如滑動視窗中的最大值問題 eg 1,1,2,3,4 5,6,7,7,9 ...