题不难,迭代法。
#include<bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(), (x).end()
#define for0(a, n) for (int (a) = 0; (a) < (n); (a)++)
#define for1(a, n) for (int (a) = 1; (a) <= (n); (a)++)
typedef long long ll;
typedef pair<int, int> pii;
const int INF =0x3f3f3f3f;
const int maxn= 1000000 ;
int a[maxn+10],n;
ll ans,sum[maxn+10];
int ale,ari;
int L[maxn+10],R[maxn+10];
void update(ll val,int le,int ri)
{
if(val>ans)
{
ans=val;
ale=le;
ari=ri;
}
}
void pre()
{
sum[0]=0;
sum[1]=a[1];
L[1]=1;
for(int i=2;i<=n;i++)
{
sum[i]=sum[i-1]+a[i];
int p=i;
while(p-1>=1&&a[p-1]>=a[i] )
{
p=L[p-1];
}
L[i]=p;
}
R[n]=n;
for(int i=n-1;i>=1;i--)
{
int p=i;
while(p+1<=n&&a[p+1]>=a[i])
{
p=R[p+1];
}
R[i]=p;
}
}
void work()
{
for1(i,n)
{
int le=L[i],ri=R[i];
ll t=sum[ri]-sum[le-1];
t*=a[i];
update(t,le,ri);
}
}
int main()
{
int kase=0;
while(~scanf("%d",&n))
{
if(kase++) putchar('\n');
for1(i,n)
{
scanf("%d",&a[i]);
}
ans=(ll)a[1]*a[1];//当初三个值初始化为-1,-1,-1不知道为何wa
ale=1,ari=1;
pre();
work();
printf("%lld\n%d %d\n",ans,ale,ari);
}
return 0;
}