51Nod 1349 最大值(單調棧)

2021-08-04 04:28:10 字數 1626 閱讀 6604

1349 最大值

基準時間限制:1 秒 空間限制:131072 kb 分值: 80 

難度:5級演算法題

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

input

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

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

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

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

output

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

3

1 2 331

23

output示例

6

53

system message

(題目提供者)

單調棧的題 

這道題一開始資料量就很大。。

注意三個方面

1.在計算每個數區間的子集合個數 需要用(i-l)+(r-i)+(i-l)*(r-i)+1 公式自己觀察一段時間就能得出

2.可能會有相同的書 這個時候 就要保證區間具有單向性 即從左到右遍歷時 碰到等於的是否繼續 而從右到左相反 才能保證不重複計算

3.如果一邊遍歷完 清空棧再遍歷 會有乙個資料會t 所以再開個棧就好

個人認為三個地方都值得思考

這個**因為比較複雜所以跑到臨界點 好像因為伺服器問題可能會t 不過一般不會

#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

long long int a[111111];

long long int l[111111];

long long int r[111111];

long long int endans[111111];

long long int ans[111111];

stacks;

int main()

for(int i=1;i<=n;i++)

else

else}}

}stackss;

for(int i=n;i>=1;i--)

else

int m=0;

scanf("%d",&m);

while(m--)}}

51nod 1349 最大值 單調棧

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

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...