題意:求序列中每個點右邊第乙個》=自身的點的下標。
思路:簡單介紹單調棧,主要用來求向左/右第乙個小於/大於自身的下標,直接求的話複雜度為o(n2),而單調棧只有o(n),利用好單調棧十分有用。乙個元素向左遍歷的第乙個比它小的數的位置就是將它插入單調棧時棧頂元素的值,若棧為空,則說明不存在這麼乙個數。然後將此元素的下標存入棧,就能類似迭代般地求解後面的元素。
單調棧的本質是,當乙個數a在另乙個數b前面且比b大,那麼數a就在找第乙個比某數小的問題裡就完全沒有考慮的必要了,他被b完全遮蔽了。
這道題就是單調棧的簡單應用,模板題。注意結果用int存不下,需要用long long。
ac**:
#includeusingnamespace
std;
int n,a[80005],stk[80005
],p;
long
long
ans;
intmain()
printf(
"%lld\n
",ans);
return0;
}
POJ 3250 單調棧模板
題意 從左右給你n頭都面向右牛的高度,每頭牛能被左邊的牛看到當且僅當自己的身高比他低且中間沒有障礙物 求每頭牛能看到的牛數量之和 include include include include include include include include include include inclu...
單調棧應用POJ3250 單調序列
參考 單調棧,顧名思義,是棧內元素保持一定單調性 單調遞增或單調遞減或是其他性質 的棧。我們假如有這樣乙個問題 poj3250 給定一組數,針對每個數,尋找它和它右邊第乙個比它大的數之間有多少個數。如果用樸素的解法就會是雙層for迴圈遍歷,時間複雜度達到o n 2 利用單調棧思想的解法則會降至限行時...
POJ 3250 單調堆疊
其實今天是第一次聽說這個資料結構。順便ac了一道題目 所以這個堆疊顯然會滿足一些條件 1.對於所有當前步驟壓入堆疊的元素e,棧中的其餘元素都是 遞增 或遞減 的大於 或小於 e 2.對於彈出的所有元素,一定全都 小於或大於e 這個題目第一眼看到應該是乙個 n 2 的暴力搜尋,但是明顯如果用暴力搜尋的...