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 ...