有一天,小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...