一群高度不完全相同的牛從左到右站成一排,每頭牛只能看見它右邊的比它矮的牛的髮型,若遇到一頭高度大於或等於它的牛,則無法繼續看到這頭牛後面的其他牛。
給出這些牛的高度,要求每頭牛可以看到的牛的數量的和。
把要求作一下轉換,其實就是要求每頭牛被看到的次數之和。這個可以使用單調棧來解決。
從左到右依次讀取當前牛的高度,從棧頂開始把高度小於或等於當前牛的高度的那些元素刪除,此時棧中剩下的元素的數量就是可以看見當前牛的其他牛的數量。把這個數量加在一起,就可以得到最後的答案了。
ac code
#include
using namespace std;
const
int maxn =
1000000+5
;int n;
long
long h[maxn]
;stack <
int> ans;
intmain()
res+
=ans.
size()
;//能被前面幾個人看見
ans.
push
(i);
//進棧
} cout<}
POJ 3250 單調棧模板
題意 從左右給你n頭都面向右牛的高度,每頭牛能被左邊的牛看到當且僅當自己的身高比他低且中間沒有障礙物 求每頭牛能看到的牛數量之和 include include include include include include include include include include inclu...
單調棧應用POJ3250 單調序列
參考 單調棧,顧名思義,是棧內元素保持一定單調性 單調遞增或單調遞減或是其他性質 的棧。我們假如有這樣乙個問題 poj3250 給定一組數,針對每個數,尋找它和它右邊第乙個比它大的數之間有多少個數。如果用樸素的解法就會是雙層for迴圈遍歷,時間複雜度達到o n 2 利用單調棧思想的解法則會降至限行時...
poj3250(單調棧模板題)
題意 求序列中每個點右邊第乙個 自身的點的下標。思路 簡單介紹單調棧,主要用來求向左 右第乙個小於 大於自身的下標,直接求的話複雜度為o n2 而單調棧只有o n 利用好單調棧十分有用。乙個元素向左遍歷的第乙個比它小的數的位置就是將它插入單調棧時棧頂元素的值,若棧為空,則說明不存在這麼乙個數。然後將...