给出一组巨型的高度,问能组成的最大矩形面积是多少
策略是首先往右边扫描,记录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; }