hdu 1506 Largest Rectangle in a Histogram

来源:互联网 发布:手机怎么打开php视频 编辑:程序博客网 时间:2024/05/22 10:58
//给一个柱形图,找到其中面积最大的矩形。//对于每一个柱形,找到它最左边的,高度大于等于它下标, 同理也要找到它最右边的,高度大于等于它的 下标。//但如果普通的顺序遍历的话,最坏情况会退化成O(n^2),这里的优化方法就是,如果当前查找的柱形比它大于等于,那么就直接去找当前柱形的边界。//这样的话,查找就是跳跃式的。#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>using namespace std;#define N 100005long 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;}