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;

}


你可能感兴趣的:(HDU)