51nod 1349 最大值(單調棧)

2021-10-10 02:46:55 字數 1390 閱讀 8075

有一天,小a給了小b一些數字,讓小b幫忙找到其中最大的數,由於小b是乙個程式猿,當然寫了乙個**很快的解決了這個問題。

這時,**的小c又出現了,他問小b,假如我只需要知道這些數字中的某個區間的最大值,你還能做嘛?

小b經過七七四十九天的思考,終於完美的解決了這道題目,這次,他想也讓小c嚐嚐苦頭,於是他問小c,我現在想知道存在多少不同的區間的最大值大於等於k,你還能做嗎?

這次,小c犯了難,他來請教身為程式猿的你。

hint:乙個區間指al,al+1,…,ar這一段的數且l<=r,乙個區間的最大值指max,兩個區間不同當且僅當[l1,r1],[l2,r2]中l1不等於l2或r1不等於r2

輸入第一行讀入乙個正整數n(1<=n<=100000),表示有n個數字。

接下來一行讀入n個正整數ai(1<=ai<=100000)

接下來一行乙個正整數q(1<=q<=100000),表示有q組詢問。

接下來q行,每行乙個正整數k(1<=k<=100000)

輸出q行,每行乙個正整數,表示存在多少區間大於等於k。

輸入樣例

31 2 331

23輸出樣例65

3**

#include

#define ll long long

using namespace std;

const

int maxn =

100010

;// r[i]: 以a[i]為最大值可延伸到的區間的右邊

// l[i]: 以a[i]為最大值可延伸到的區間的左邊

// ans[i]: 以a[i]為最大值的答案數

ll r[maxn]

, l[maxn]

, ans[maxn]

, a[maxn]

, st[maxn]

;int

main()

int top =0;

for(

int i =

1; i <= n; i++)if

(top ==0)

else

st[++top]

= i;

} top =0;

for(

int i = n; i >=

1; i--)if

(top ==0)

else

st[++top]

= i;

}for

(int i =

1; i <= n; i++

)for

(int i = maxn -

1; i >=

1; i--

)int q;

cin >> q;

while

(q--

)return0;

}

51Nod 1349 最大值(單調棧)

1349 最大值 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 有一天,小a給了小b一些數字,讓小b幫忙找到其中最大的數,由於小b是乙個程式猿,當然寫了乙個 很快的解決了這個問題。這時,的小c又出現了,他問小b,假如我只需要知道這些數字中的某個區間的最大值,你還...

51nod 1349 最大值 單調棧

有一天,小a給了小b一些數字,讓小b幫忙找到其中最大的數,由於小b是乙個程式猿,當然寫了乙個 很快的解決了這個問題。這時,的小c又出現了,他問小b,假如我只需要知道這些數字中的某個區間的最大值,你還能做嘛?小b經過七七四十九天的思考,終於完美的解決了這道題目,這次,他想也讓小c嚐嚐苦頭,於是他問小c...

最大值(單調棧)

時間限制 1 sec 記憶體限制 128 mb 提交 狀態 題目描述 給出n個整數,和乙個長度值len,要求在這n個整數中每個長度為len的連續一段數中的最大值。例如 n 8,len 3,8個整數是 2 5 1 1 2 4 7 1。答案是 5 5 2 4 7 7 解釋 2 5 1的最大值是5 5 1...