a[i] 最小的区间是固定的,可以用一个栈啊什么的求出左右比之小的第一个数的位置,
而后就是模拟,但是我的代码过不了LA上HERE不知到时为什么。‘
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#include<cmath>
#include<vector>
using namespace std;
#define FOR(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define nMax 101000
#define inf 0x7fffffff
#define LL long long
#define pb push_back
int l[nMax],r[nMax];
LL sum[nMax],a[nMax];
int n;
void init(){
l[1]=0;
FOR(i,2,n) {
if(a[i]==0) {l[i]=i-1;continue;}
int j=i-1;
while(a[j] >= a[i] && j>0) j = l[j];
l[i] = j;
}
r[n] = n+1;
for(int i=n-1;i>=1;i--) {
if(a[i]==0){r[i]=i+1;continue;}
int j=i+1;
while(a[j] >= a[i] && j<=n) j = r[j];
r[i] = j;
}
}
void sovle(){
LL ans = -1;
int L,R;L=R=-1;
FOR(i,1,n) {
LL b = a[i] * (sum[r[i]-1] - sum[l[i]]);
if(b > ans) {
ans = b;
L = l[i]+1;R=r[i]-1;
}else if(b == ans){
if(r[i]-l[i]-2 < R-L){
L=l[i]+1;R=r[i]-1;
}
}
}
printf("%lld\n%d %d\n",ans,L,R);
}
int main(){
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
scanf("%d",&n);
sum[0] = 0LL;
FOR(i,1,n){
scanf("%lld",&a[i]);
sum[i]=sum[i-1]+a[i];
}
init();
sovle();
return 0;
}
![](https://img-my.csdn.net/uploads/201304/19/1366379471_8743.png)