定义二个数组,分别记录下某个位置的值所能达到的左边和右边,来使题目条件成立,然后再遍历一遍数组即可。
<span style="font-size:12px;">#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <cctype>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define maxn 1000010
#define INF 1<<30
ll sum[maxn];
int v[maxn],l[maxn],r[maxn];
int main ()
{
int n;
int kase = 0;
while(scanf("%d",&n) != EOF)
{
sum[0] = 0;
if(kase) printf("\n");
kase++;
for(int i = 1; i <= n; i++)
{
scanf("%lld",&v[i]);
sum[i] = sum[i-1] + v[i];
l[i] = i;
r[i] = i;
}
for(int i = 1; i <= n; i++)
{
if(v[i] > 0) while(v[l[i]-1] >= v[i])
{
l[i] = l[l[i]-1];
}
}
for(int i = n; i >= 1; i--)
{
if(v[i] > 0) while(v[r[i] + 1] >= v[i])
{
r[i] = r[r[i] + 1];
}
}
ll ans = 0;
int ll = 1, rr = 1;
long long nu;
for(int i = 1; i <= n; i++)
{
if(v[i] > 0)
{
nu = v[i] *(sum[r[i]] - sum[l[i] - 1]);
if(nu > ans)
{
ans = nu;
ll = l[i];
rr = r[i];
}
else if(nu == ans)
{
if(rr - ll == r[i] - l[i] && l[i] < ll) ll = l[i],rr = r[i];
}
}
}
printf("%lld\n%d %d\n",ans,ll,rr);
}
return 0;
}
</span>