题目分析
题意
每个矩形的宽都为1,输入n个矩形的高度a[i],求最大矩形的面积。
思路
找出a[i]左边和右边连续的大于等于高度a[i]的宽度和,然后与a[i]相乘的最大值即为所求。用l[i]表示比a[i]大的数连续的最左边的位置, r[i]表示比a[i]大的数连续的最右边的位置 。
代码
#include<stdio.h>
#define LL long long
#define N 100002
int i,n,t;
LL a[N],l[N],r[N],max;
int main(){
//freopen("data.txt","r",stdin);
while(~scanf("%d",&n),n){
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];
l[i]=t;
}
for(i=n-1;i>=1;--i){
t=i;
while(t<n&&a[i]<=a[t+1])
t=r[t+1];
r[i]=t;
}
max=0;
for(i=1;i<=n;++i)
if((r[i]-l[i]+1)*a[i]>max)
max=(r[i]-l[i]+1)*a[i];
printf("%lld\n",max);
}
return 0;
}