單調棧小結
阿新 • • 發佈:2018-04-27
一個 .com [1] HR .html 將不 因此 logs nbsp
單調棧
單調棧是解決這樣一類問題
給出$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
有些難度,用到了單調棧的思想
題解
單調棧小結