有一天,小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
這題是乙個叫做控制區間的idea。考慮列舉某乙個數為某區間的最大值,那麼,這個區間的邊界就是前後第乙個比它的數(先不考慮相等的情況)。這個顯然單調棧就可以處理,那麼以當前列舉的數為最大值的區間個數就是(i
−l[i
])∗(
r[i]
−i) 。對於兩個數相等的情況,只要處理一下,使得預設前面或後面的數更大就可以防止因兩數相等而重複計算的問題。
#include
#include
#include
#define maxn 100006
#define ll long long
using
namespace
std;
inline
char nc()
inline
int _read()
int n,t,top,stack[maxn],l[maxn],r[maxn],a[maxn];
ll sum[maxn];
void push(int x,int p)
int main()
top=0;stack[0]=n+1;
for(int i=n;i>=1;i--)
for(int i=100000;i>=1;i--)sum[i]+=sum[i+1];
t=_read();
while(t--)
return
0;}
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...