洛谷 P2422 良好的感觉
洛谷 P2422 良好的感觉
题目描述
kkk 做了一个人体感觉分析器。每一天,人都有一个感受值 A_iA**i,A_iA**i 越大,表示人感觉越舒适。在一段时间 \left[i, j\right][i,j] 内,人的舒适程度定义为 \left[i, j\right][i,j] 中最不舒服的那一天的感受值 \times× \left[i, j\right][i,j]中每一天感受值的和。现在给出 kkk 在连续 NN 天中的感受值,请问,在哪一段时间,kkk 感觉最舒适?
输入格式
第一行为 NN,代表数据记录的天数。
第二行 NN 个整数,代表每一天的感受值。
输出格式
一行,表示在最舒适的一段时间中的感受值。
题解:
代码:
#include<cstdio>
#include<algorithm>
#define int long long
using namespace std;
const int maxn=1e5+5;
int n;
int a[maxn],sum[maxn];
int s[maxn],top;
int l[maxn],r[maxn];
struct node
{
int l,r,b;
}ans;
signed main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
sum[i]=sum[i-1]+a[i];
}
a[0]=a[n+1]=-1;
for(int i=1;i<=n+1;i++)
{
while(top && a[i]<=a[s[top]])
{
r[s[top]]=i;
top--;
}
s[++top]=i;
}
while(top)
top--;
for(int i=n;i>=0;i--)
{
while(top && a[i]<=a[s[top]])
{
l[s[top]]=i;
top--;
}
s[++top]=i;
}
ans.b=0;
for(int i=1;i<=n;i++)
{
int len=sum[r[i]-1]-sum[l[i]];
int tmp=a[i]*len;
if(ans.b<tmp)
{
ans.b=tmp;
ans.l=l[i]+1;
ans.r=r[i]-1;
}
}
printf("%lld",ans.b);
return 0;
}