单调栈作用
给定n个数,单调栈可以用来查询每个数左/右边第一个小于它的数的位置
模板题——洛谷P2422 良好的感觉
kkk做了一个人体感觉分析器。每一天,人都有一个感受值Ai,Ai越大,表示人感觉越舒适。在一段时间[i, j]内,人的舒适程度定义为[i, j]中最不舒服的那一天的感受值 * [i, j]中每一天感受值的和。现在给出kkk在连续N天中的感受值,请问,在哪一段时间,kkk感觉最舒适?
尝试枚举每一天作为最不舒服的一天来扩展区间更新答案即可
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long lt;
lt read()
{
lt f=1,x=0;
char ss=getchar();
while(ss<'0'||ss>'9'){if(ss=='-')f=-1;ss=getchar();}
while(ss>='0'&&ss<='9'){x=x*10+ss-'0';ss=getchar();}
return f*x;
}
const int maxn=100010;
int n;
lt a[maxn],sum[maxn],ans;
int reml[maxn],remr[maxn];
int st[maxn],top;
int main()
{
n=read();
for(int i=1;i<=n;++i)
a[i]=read(),sum[i]=sum[i-1]+a[i];
for(int i=1;i<=n;++i)
{
while(top&&a[i]<=a[st[top]]) --top;
reml[i]=st[top];
st[++top]=i;
}
top=0;
for(int i=n;i>=1;--i)
{
while(top&&a[i]<=a[st[top]]) --top;
remr[i]=st[top]==0?n+1:st[top];
st[++top]=i;
}
for(int i=1;i<=n;++i)
ans=max(ans,a[i]*(sum[remr[i]-1]-sum[reml[i]]));
printf("%lld",ans);
return 0;
}