洛谷 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;
}
posted @ 2020-11-04 14:14  Seaway-Fu  阅读(120)  评论(0编辑  收藏  举报