L[i]表示区间[L[i],i ]内的x均有a[x]>=a[i],且L[i]取最小值。
R[i]表示区间[i, R[i] ]内的x均有a[x]>=a[i],且R[i]取最大值。
就是枚举高度最低的矩形,形成的矩形高度为 该矩形高度,之前预处理 找到最左边界,和右边界。
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int INF =0x3f3f3f3f;
const int maxn=100000 ;
int n;
ll a[maxn+5];
int R[maxn+5],L[maxn+5];
int main()
{
while(~scanf("%d",&n)&&n)
{
scanf("%lld",&a[1]);
L[1]=1;
for(int i=2;i<=n;i++)
{
scanf("%lld",&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;
}
ll ans=0;
for(int i=1;i<=n;i++)
{
ans=max(ans, a[i] *(R[i]-L[i]+1) );
}
printf("%lld\n",ans);
}
return 0;
}