学习笔记::单调栈

Posted 123456

tags:

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

单调栈和单调队列长得不是很像。

单调栈的用处是求以一个元素为中心,向两边最多拓展多远距离。

两个小时就没了。。。

poj2796

#include<cstdio>
using namespace std;
typedef long long ll;
#define N 200010
struct data
{
    ll v,sum,l,r;
}x[N],st[N],ans;
ll n;
inline void read(ll&a)
{
    ll x=0,f=1; char c=getchar();
    while(c<\'0\'||c>\'9\') {if(c==\'-\') f=-1; c=getchar(); }
    while(c>=\'0\'&&c<=\'9\') {x*=10; x+=c-\'0\'; c=getchar(); }
    a=x*f;
}
int main()
{
    read(n);
    for(int i=1;i<=n;++i) read(x[i].v),x[i].sum=x[i].v,x[i].r=x[i].l=i;
    int top=0;
    for(int i=1;i<=n;++i)
    {
        while(top&&x[i].v<=st[top].v)
        {
            if(st[top].v*st[top].sum>ans.v)
            {
                ans.v=st[top].v*st[top].sum;
                ans.l=st[top].l;
                ans.r=st[top].r;
            }
            if(top>1&&x[i].v<=st[top-1].v) 
            {
                st[top-1].sum+=st[top].sum;
                st[top-1].r=st[top].r;
            }            
            if(st[top-1].v<x[i].v) 
            {
                x[i].sum+=st[top].sum;
                x[i].l=st[top].l;
            }
            --top;
        }
        st[++top]=x[i];        
    }
    while(top>=0)
    {
        if(st[top].v*st[top].sum>ans.v)
        {
            ans.v=st[top].v*st[top].sum;
            ans.l=st[top].l;
            ans.r=st[top].r;
        }
        st[top-1].sum+=st[top].sum;
        st[top-1].r=st[top--].r;
    }
    if(ans.l==0) ans.l=ans.r=1;
    printf("%lld\\n%lld %lld\\n",ans.v,ans.l,ans.r);
    return 0;
}
View Code

 

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

算法学习——剑指 Offer II 039. 直方图最大矩形面积(Java实现蛮力,分治,单调栈)

算法学习——剑指 Offer II 039. 直方图最大矩形面积(Java实现蛮力,分治,单调栈)

算法学习——剑指 Offer II 039. 直方图最大矩形面积(Java实现蛮力,分治,单调栈)

golang 代码实现单调栈

单调栈

线性表--单调栈