思路,dpl[i]表示从i下标开始往左边扫描,每一个高度都小于等于arr[i] (arr[i]是高度)最左边的下标值,dpr[i]表示从下标i往右开始扫描,每一个高度都小于等于arr[i] (arr[i]是高度)最右边的下标值,最后枚举一遍结果寻找最大值
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn= 100100;
long long arr[maxn],ans=0;
long long dpl[maxn],dpr[maxn];
int n,t;
int main()
{
while(~scanf("%d",&n)&&n!=0)
{
for(int i=1;i<=n;i++)
scanf("%lld",&arr[i]);
dpl[1]=1;
dpr[n]=n;
for(int i=2;i<=n;i++)
{
t=i;
while(t>1&&arr[i]<=arr[t-1])
t=dpl[t-1];
dpl[i]=t;
}
for(int i=n-1;i>=1;i--)
{
t=i;
while(t<n&&arr[i]<=arr[t+1])
t=dpr[t+1];
dpr[i]=t;
}
ans=0;
for(int i=1;i<=n;i++)
{
long long temp=(long long)(dpr[i]-dpl[i]+1)*arr[i];
ans=max(ans,temp);
}
printf("%lld\n",ans);
}
}