单调队列 POJ 2559 Largest Rectangle in a Histogram

来源:互联网 发布:java实现音乐网站 编辑:程序博客网 时间:2024/05/16 23:58

这道题交的时候神奇ac了,感觉好开心wakaka

题意:在给出的方块的组合图形中找到最大的矩形,并输出最大矩形的面积!

从第一个位置到第n个位置循环,循环操作为:找出当前位置右边的比它低的位置,说明已经不能继续延伸了,算出这种情况下的面积在比较看是否为最大面积

注意队列中有两个元素,一个是当前的高度,另一个是起始的位置,

#include<cstdio>#include<queue>#include<algorithm>#include<iostream>#include<cstring>    using namespace std;long long num[100000+5];int main(){    long long n;    while(~scanf("%I64d",&n)){        if(n==0)            break;        memset(num,0,sizeof(num));        for(long long i=1;i<=n;i++){            scanf("%I64d",&num[i]);        }        deque<pair<long long,long long> >minq;        minq.clear();        long long ans=0;        for(long long i=1;i<=n;i++){            long long my_s=i;            while(!minq.empty()&&num[i]<minq.back().second){                my_s=min(my_s,minq.back().first);                long long tmp=(i-minq.back().first)*minq.back().second;                 ans=max(ans,tmp);                minq.pop_back();            }            minq.push_back(make_pair(min(i,my_s),num[i]));        }        while(!minq.empty()){            long long kk=minq.front().second*(n-minq.front().first+1);            ans=max(ans,kk);            minq.pop_front();        }        printf("%I64d\n",ans);    }    return 0;}


!!!注意:整个循环结束后,有一个非严格单调递增队列的在deque中,如::1 1 3 3

要计算这个所组成的矩形看看是否可能是最终答案!因为其单调递增特性,所以矩形的长度为n-(起始位置)


0 0
原创粉丝点击