單調棧是解決這樣一類問題
給出$n$個數,問每乙個數向左第乙個比它小的數是誰如果直接暴力的話,最壞情況下肯定是$o(n^2)$的,但是單調棧可以在$o(n)$的時間內解決這類問題
單調棧,顧明思議嘛,就是維護乙個具有單調性的棧,至於是單調遞增還是單調遞減,這個視題目而定
對於上面那個問題而言,我們需要維護乙個單調上公升的序列
加入乙個元素的時候,若當前元素比棧頂元素小,那麼就不斷的彈出棧頂元素,直到整個棧滿足單調
那麼該位置向左第乙個比它小的就是棧頂
上面說的太抽象了
比如,我們有乙個序列$2,4,3,5,2$
設$ans[i]$表示第$i$個位置的答案
$2$加入序列,此時序列為$2$,$ans[1]=0$
$4$加入序列,此時序列為$2,4$,$ans[2]=2$
$3$加入序列,我們發現,如果將$3$直接加入序列,此時序列將不滿足單調性,於是先刪除$4$,再加入$3$,此時序列為$2,3$,$ans[3]=2$
$5$加入序列,此時序列為$2,3,5$,$ans[4]=5$
$2$加入序列,刪除$2,3,5$,加入$2$,此時序列為$2$,$ans[5]=0$
考慮每乙個元素最多被加入/刪除一次,因此時間複雜度為$o(n)$
至於為什麼,感覺挺顯然的吧,就是利用單調性
都是些水題
洛谷p2688
題解hdu1506
題解bzoj1007
有些難度,用到了單調棧的思想
題解
單調棧 模板 單調棧模板
biu 單調棧主要用於求取左邊第乙個比它大,或者比它小的數。就比如站隊隨便排成一列,可以求到每個人後面第乙個比他高的人。同理可以推廣至右邊,比它矮均可。這就是單調遞增棧 遞減棧,從前至 棧,從後向前入棧的區別了。單調棧比較抽象,非常具有智慧型的想法,可應用的場景相當少,根據幾個經典題目體會它的用法會...
單調佇列 單調棧
參考文章 單調佇列 poj 2823 給定乙個數列,從左至右輸出每個長度為m的數列段內的最小數和最大數。數列長度 n 106 m n n 106,m n n 106 m n 直接暴力求解複雜度在0 mn 可以考慮維護區間最值,單調佇列則是維護區間佇列的強大 單調佇列的定義 單調佇列實現的大致過程 1...
小結 單調棧 單調佇列
對於維護資訊具有單調性的性質或者問題可以轉化為具有單調性質的模型的題,我們可以考慮用單調棧或單調佇列。技巧很多,只要能將問題轉化為單調性問題,就好解決了。當維護固定長度的單調區間,我們考慮用單調佇列,如 bzoj 3314 usaco2013 nov crowded cows 單調佇列 bzoj 1...