1. 程式人生 > >單調棧小結

單調棧小結

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

有些難度,用到了單調棧的思想

題解

單調棧小結