给出一组巨型的高度,问能组成的最大矩形面积是多少

策略是首先往右边扫描,记录l[i]为大于第i个高度的最后一个序号
然后往右边扫描,记录r[i]是往右边去大于第i个高度的最后一个序号,这样再进行下一个搜索的时候可以省时
类似于之前一道 who is front of me的题
#include<iostream>
using namespace std;
int l[100002],r[100002];
long h[100002];
int main()
{ int n,i,j; long long max,p;
while(scanf("%d",&n),n)
{ for(i=1;i<=n;i++)
scanf("%ld",&h[i]);
h[0]=-1;
for(i=1;i<=n;i++) //找左边界
{ j=i-1;
while(h[i]<=h[j]) j=l[j]; l[i]=j; }
h[n+1]=-1;
for(i=n;i>0;i--) //找右边界
{ j=i+1; while(h[i]<=h[j]) j=r[j]; r[i]=j; }
max=0; for(i=1;i<=n;i++)
{ p=(long long)(r[i]-l[i]-1)*h[i];
max=p>max?p:max; } printf("%lld\n",max);
}
return 0; }

浙公网安备 33010602011771号