單調棧模型 山峰

2021-08-04 06:29:24 字數 1501 閱讀 1516

山峰

time limit: 1000ms memory limit: 65536kb

problem description

金石山脈有n個山峰,一字排開,從西向東依次編號為1, 2, 3, ……, n。編號為i的山峰高度為hi。每個山峰的高度兩兩不同

小木示從西向東依次爬過這n個山峰,到每乙個山峰的山頂的時候,他都會往西邊眺望,並且會記錄下自己能看到的山峰的個數。

(比如說小木示 現在在4號山峰,前四號山峰的高度分別為9,4,5,1。他現在能看到的山峰個數就是2,因為第二個山峰被第三個山峰擋住了)

嚴格的來說,小木示在i位置的時候,對於乙個山峰j (j < i),如果不存在乙個山峰k滿足hj < hk (j < k < i)。則山峰j是可見的。

小木示把自己記錄的山峰的個數加和作為這次爬山的快樂值,現在給你n個山峰的高度,求小木示的快樂值。

input

多組輸入,首先輸入乙個n(1 <= n <= 10^6),表示山峰的個數。

接下來一行n個數,表示對應山峰的山峰的高度(1 <= h <= 10^6)。

output

輸出小木示的快樂值

example input

4 1 6 5 1

example output

hint

author

2016暑假集訓結訓賽 by juechen

本題目用到了單調棧,那麼什麼是單調棧呢,看下面:

單調棧與單調佇列很相似。首先棧是後進先出的,單調性指的是嚴格的遞增或者遞減。

單調棧有以下兩個性質:

1、若是單調遞增棧,則從棧頂到棧底的元素是嚴格遞增的。若是單調遞減棧,則從棧頂到棧底的元素是嚴格遞減的。

2、越靠近棧頂的元素越後進棧。

單調棧與單調佇列不同的地方在於棧只能在棧頂操作,因此一般在應用單調棧的地方不限定它的大小,否則會造成元素無法進棧。

元素進棧過程:對於單調遞增棧,若當前進棧元素為e,從棧頂開始遍歷元素,把小於e或者等於e的元素彈出棧,直接遇到乙個大於e的元素或者棧為空為止,然後再把e壓入棧中。對於單調遞減棧,則每次彈出的是大於e或者等於e的元素。

乙個單調遞增棧的例子:

進棧元素分別為3,4,2,6,4,5,2,3

3進棧:(3)

3出棧,4進棧:(4)

2進棧:(4,2)

2出棧,4出棧,6進棧:(6)

4進棧:(6,4)

4出棧,5進棧:(6,5)

2進棧:(6,5,2)

2出棧,3進棧:(6,5,3)

以上左端為棧底,右端為棧頂。

#include 

#include

#include

#include

#include

using

namespace

std;

int main()

sta.push(p);

}cout

<}

}

單調棧 模板 單調棧模板

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

單調佇列 單調棧

參考文章 單調佇列 poj 2823 給定乙個數列,從左至右輸出每個長度為m的數列段內的最小數和最大數。數列長度 n 106 m n n 106,m n n 106 m n 直接暴力求解複雜度在0 mn 可以考慮維護區間最值,單調佇列則是維護區間佇列的強大 單調佇列的定義 單調佇列實現的大致過程 1...

棧和佇列 單調佇列 單調棧

講解部落格鏈結 一 單調棧 1 什麼是單調棧?單調棧是指乙個棧內部元素具有嚴格單調性 單調遞增,單調遞減 的一種資料結構。2 單調棧的兩個性質 滿足從棧頂到棧底具有嚴格的單調性 滿足後進先出的特徵,越靠近棧底的元素越早的進棧。3 元素進棧的過程 對於當前進棧元素x 如果x 棧頂元素,x 進棧。否則 ...