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個數字。output接下來一行讀入n個正整數ai(1<=ai<=100000)
接下來一行乙個正整數q(1<=q<=100000),表示有q組詢問。
接下來q行,每行乙個正整數k(1<=k<=100000)
q行,每行乙個正整數,表示存在多少區間大於等於k。input示例
3output示例1 2 331
23
653
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...