hdu 1506 Largest Rectangle in a Histogram
//给一个柱形图,找到其中面积最大的矩形。
//对于每一个柱形,找到它最左边的,高度大于等于它下标, 同理也要找到它最右边的,高度大于等于它的 下标。
//但如果普通的顺序遍历的话,最坏情况会退化成O(n^2),这里的优化方法就是,如果当前查找的柱形比它大于等于,那么就直接去找当前柱形的边界。
//这样的话,查找就是跳跃式的。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
#define N 100005
long long h[N],l[N],r[N];
int main()
{
int n,tmp;
while(scanf("%d",&n)&&n)
{
for(int i=1;i<=n;i++)
scanf("%I64d",&h[i]);
h[n+1]=h[0]=-1;
l[1]=1;
r[n]=n;
for(int i=1;i<=n;i++)
{
tmp=i;
while(1)
{
if(h[tmp-1]>=h[i]) tmp=l[tmp-1];
else break;
}
l[i]=tmp;
}
for(int i=n;i>=1;i--)
{
tmp=i;
while(1)
{
if(h[tmp+1]>=h[i]) tmp=r[tmp+1];
else break;
}
r[i]=tmp;
}
long long ans=0;
for(int i=1;i<=n;i++)
{
ans=max(ans,h[i]*(r[i]-l[i]+1));
}
printf("%I64d\n",ans);
}
return 0;
}

浙公网安备 33010602011771号