题目链接:点击打开链接
看的别人的代码写的:点击打开链接
#include <iostream>
#include<cstdio>
#define LL long long
using namespace std;
const int maxn=1e6+10;
LL a[maxn],l[maxn],r[maxn];
int main()
{
LL n,Max,i,t;
while(~scanf("%lld",&n)&&n)
{
Max=0;
for(i=1; i<=n; i++)
scanf("%lld",&a[i]);
l[1]=1;
r[n]=n;
for(i=2; i<=n; i++)
{
t=i;
while(t>1&&a[i]<=a[t-1])t=l[t-1];//t>1是考虑t==1的时候,直接跳出循环。找到左边高度比他高的边界
l[i]=t;
}
for(i=n-1; i>=1; i--)
{
t=i;
while(t<n&&a[i]<=a[t+1])t=r[t+1]; //t<n是考虑t==n的情况,直接跳出循环,找到左边高度比他高的边界
r[i]=t;
}
for(i=1; i<=n; i++)
{
Max=max(Max,(r[i]-l[i]+1)*a[i]);
}
printf("%lld\n",Max);
}
return 0;
}