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;
}


posted @ 2013-08-04 21:14  坚固66  阅读(162)  评论(0编辑  收藏  举报