單調棧的運用

2021-08-22 06:19:54 字數 621 閱讀 7070

題目大意:有一群列隊,面朝右站立的牛,輸入每頭牛的身高,如果視線前方有一頭高於自己的牛,則看不到它之後的牛;求出所有牛能看到頭頂的個數。

n方演算法超時,故考慮優化,首先能想到的是,在計算左邊的牛能看到多少牛時,可以利用右邊的結果。棧優化的思路即是,從右向左遍歷牛的身高,同時對棧進行操作(棧中存放牛的編號),棧首牛低於當前牛,則去掉該元素;反之則說明該牛最遠能看到的,是棧首牛的前一頭牛。如果棧空,則說明能一直看到頭。至於為何該演算法是正確的,核心原因在於,靠前的牛的身高對看的距離遠近影響至關重要,所以用靠前的牛的身高來更新棧是正確的。即每當出現較高的牛,棧中後面那些身高較低的牛可以被忽略,一直忽略到比這個牛更高的牛為止,因為如果連這頭牛的身高都無法達到,就沒有必要再其後的矮牛設卡;而在身後更高的牛處設卡,就表示越過這個障礙時能一直看到那麼遠。

ac**:

#include#include#includeusing namespace std;

int st[80010],h[80010];

int n,p;

long long ans;

int main()

cout<}

return 0;

}

單調棧的運用

單調棧本質上只是單調遞增或遞減的棧,有點類似於單調佇列,但不同之處在於插入乙個元素時,會彈出棧中 所有不符合單調性的元素 來個例子吧!當乙個單增的棧stack 向其中壓入元素6時,stack 向其中壓入元素2時,stack彈出2,3,4,且stack 向其中壓入0時,stack彈出1,2,3,4,s...

單調棧的運用

單調棧可以用來是實現在 離線的情況下,o n 的處理出陣列中所有點比某個點小或大最近的距離是多少 具體做法是用棧來維護一邊的點的下表,由於假如ihj 那麼h i 便永無出頭之日 可以把他刪了,而在棧裡能找到的直到第一次出現的小與hi的h j 就一定是最近的,每個點出棧一次,進棧一次,所以時間複雜度是...

單調棧 模板 單調棧模板

biu 單調棧主要用於求取左邊第乙個比它大,或者比它小的數。就比如站隊隨便排成一列,可以求到每個人後面第乙個比他高的人。同理可以推廣至右邊,比它矮均可。這就是單調遞增棧 遞減棧,從前至 棧,從後向前入棧的區別了。單調棧比較抽象,非常具有智慧型的想法,可應用的場景相當少,根據幾個經典題目體會它的用法會...