题目描述
思路:
直接求出对于i为最小值时最大的答案,然后max就行了
c o d e code code
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long n, a[101010], tl ,v[101010], ans[101010];
long long ans1[101010], sum[101010];
long long b[101010], maxx=0;
int main()
{
int t=0;
while(scanf("%lld", &n)!=EOF)
{
if(t++)
printf("\n");
long long flag=0;
for(long long i=1; i<=n; i++)
{
scanf("%lld", &a[i]);
sum[i]=sum[i-1]+a[i];
if(a[i]!=0) flag=1;
}
if(flag==0)
{
memset(v, 0, sizeof(v));
memset(ans, 0, sizeof(ans));
memset(ans1, 0, sizeof(ans1));
memset(sum, 0, sizeof(sum));
printf("0\n1 1\n");
continue;
}
long long tl=1;
v[1]=n+1;
a[0]=a[n+1]=-1;
for(long long i=n; i>=1; i--)
{
while(a[i]<=a[v[tl]]&&tl>0)
tl--;
ans[i]=v[tl];
v[++tl]=i;
}
memset(v, 0, sizeof(v));
tl=1;
for(long long i=1; i<=n; i++)
{
while(a[i]<=a[v[tl]]&&tl>0)
tl--;
ans1[i]=v[tl];
v[++tl]=i;
}
long long p1=1, p2=1;
for(long long i=1; i<=n; i++)
{
if(maxx<a[i]*(sum[ans[i]-1]-sum[ans1[i]]))
maxx=a[i]*(sum[ans[i]-1]-sum[ans1[i]]), p1=ans1[i]+1, p2=ans[i]-1;
else if(maxx==a[i]*(sum[ans[i]-1]-sum[ans1[i]])&&ans[i]-1-ans1[i]-1>p2-p1)
maxx=a[i]*(sum[ans[i]-1]-sum[ans1[i]]), p1=ans1[i]+1, p2=ans[i]-1;
else if(maxx==a[i]*(sum[ans[i]-1]-sum[ans1[i]])&&ans[i]-1-ans1[i]-1==p2-p1&&p1>ans1[i]+1)
maxx=a[i]*(sum[ans[i]-1]-sum[ans1[i]]), p1=ans1[i]+1, p2=ans[i]-1;
}
printf("%lld\n%lld %lld\n", maxx, p1, p2);
memset(v, 0, sizeof(v));
memset(ans, 0, sizeof(ans));
memset(ans1, 0, sizeof(ans1));
memset(sum, 0, sizeof(sum));
maxx=0;
}
return 0;
}