POJ 2559 单调栈

Posted alking1001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2559 单调栈相关的知识,希望对你有一定的参考价值。

POJ 2559 单调栈

题意

给你一连串的矩形的高度,他们宽的长度都是1,求组成的最大矩形的面积。

解题思路

其实就是求以每个数为最小值时,这个区间范围是什么?

暴力肯定不行,因为复杂度为O(N^2),会超时,所以我们要寻找一个更加好的办法。这里单调栈就显示出来优势了。我们可以达到O(N)的复杂度来实现这个操作。

代码实现

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<stack>
#include<queue>
#include<map>
typedef long long ll;
using namespace std;
const double esp=1e-6;
const int inf=0x3f3f3f3f;
const int MAXN=1E5+7;
ll num[MAXN], st[MAXN];
int n, top, lt[MAXN], rt[MAXN];
int main()
{
    while(scanf("%d",&n) && n!=0)
    {
        top=1; 
        st[top]=0;
        num[0]=-1; num[n+1]=-1;
        for(int i=1; i<=n; i++)
            scanf("%lld", &num[i]);
        for(int i=1; i<=n+1; i++)
        {
            lt[i]=i;//最差就是这种情况
            rt[i]=i;
            while(num[st[top]] > num[i])//单调不减的栈 
            {
                lt[i] = lt[st[top]]; //我们可以确定当前的i的最左边是栈顶元素的最左边
                rt[st[top]] = i-1; //而栈顶元素的最右边就是i-1
                top--;   
            }
            if(num[st[top]] == num[i]) lt[i] = lt[st[top]]; //和栈顶元素相等的时候
            st[++top]=i;
        }
//      for(int i=1; i<=n; i++)
//          printf("%d %d
", lt[i], rt[i]);
        ll ans=-1;
        for(int i=1; i<=n; i++)
        {
            ans = max(ans, (rt[i] - lt[i] + 1)*num[i] );
        } 
        printf("%lld
", ans);
    }
    return 0;
}

以上是关于POJ 2559 单调栈的主要内容,如果未能解决你的问题,请参考以下文章

《算法竞赛进阶指南》0x11栈 单调栈求矩形面积 POJ2559

单调栈(POJ2559)

POJ 2559 Largest Rectangle in a Histogram(单调栈) && 单调栈

POJ2559 单调栈

poj2559单调栈

[POJ 2559]Largest Rectangle in a Histogram 题解(单调栈)