美文网首页
单调 栈&&队列

单调 栈&&队列

作者: fo0Old | 来源:发表于2017-06-19 23:31 被阅读0次

题目链接:Largest Rectangle in a Histogram

单调栈:

struct node
{
    int h,id;
    node(int h,int id):h(h),id(id) {}
};

stack<node>S;
int a[100005],l[100005],r[100005];

int main()
{
    int n;
    while(scanf("%d",&n))
    {
        if(n==0)return 0;
        memset(l,0,sizeof(l));
        memset(r,0,sizeof(r));
        for(int i=1; i<=n; i++)
            scanf("%d",&a[i]);
        for(int i=1; i<=n; i++)
        {
            while(!S.empty() && S.top().h>a[i])
            {
                r[S.top().id]=i-S.top().id-1;
                S.pop();
            }
            S.push(node(a[i],i));
        }
        while(!S.empty())
        {
            r[S.top().id]=n-S.top().id;
            S.pop();
        }
        for(int i=n; i>=1; i--)
        {
            while(!S.empty() && S.top().h>a[i])
            {
                l[S.top().id]=S.top().id-i-1;
                S.pop();
            }
            S.push(node(a[i],i));
        }
        while(!S.empty())
        {
            l[S.top().id]=S.top().id-1;
            S.pop();
        }
        ll maxx=0;
        for(int i=1;i<=n;i++)
        {
            ll s=a[i]*((ll)l[i]+(ll)r[i]+1);
            if(s>maxx)maxx=s;
        }
        printf("%lld\n",maxx);
    }
    return 0;
}

题目链接:Imbalanced Array

单调栈:

struct node
{
    int h,id;
    node(int h,int id):h(h),id(id) {}
};

int a[1000005];
int lmax[1000005],rmax[1000005];
int lmin[1000005],rmin[1000005];
stack<node>S;

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
        scanf("%d",&a[i]);

    //向右拓展<=区间
    for(int i=1; i<=n; i++)
    {
        while(!S.empty() && S.top().h>a[i])
            rmin[S.top().id]=i-S.top().id-1,S.pop();
        S.push(node(a[i],i));
    }
    while(!S.empty())
        rmin[S.top().id]=n-S.top().id,S.pop();

    //向左拓展<区间
    for(int i=n; i>=1; i--)
    {
        while(!S.empty() && S.top().h>=a[i])
            lmin[S.top().id]=S.top().id-i-1,S.pop();
        S.push(node(a[i],i));
    }
    while(!S.empty())
        lmin[S.top().id]=S.top().id-1,S.pop();

    //向右拓展>=区间
    for(int i=1; i<=n; i++)
    {
        while(!S.empty() && S.top().h<a[i])
            rmax[S.top().id]=i-S.top().id-1,S.pop();
        S.push(node(a[i],i));
    }
    while(!S.empty())
        rmax[S.top().id]=n-S.top().id,S.pop();

    //向左拓展>区间
    for(int i=n; i>=1; i--)
    {
        while(!S.empty() && S.top().h<=a[i])
            lmax[S.top().id]=S.top().id-i-1,S.pop();
        S.push(node(a[i],i));
    }
    while(!S.empty())
        lmax[S.top().id]=S.top().id-1,S.pop();

    ll sum=0;
    for(int i=1;i<=n;i++)
    {
        sum+=(ll)a[i]*(lmax[i]+1)*(rmax[i]+1)-(ll)a[i]*(lmin[i]+1)*(rmin[i]+1);
    }
    printf("%lld\n",sum);
    return 0;
}

题目链接:Sliding Window

单调队列:

struct node
{
    int val,id;
    node(int val,int id):val(val),id(id) {}
    node(){}
}deq[1000005];

int a[1000005];
int l,r;

int main()
{
    int n,k;
    scanf("%d%d",&n,&k);
    for(int i=1; i<=n; i++)
        scanf("%d",&a[i]);
    l=0,r=0;
    for(int i=1; i<=n; i++)
    {
        while(r>l && a[i]<=deq[r-1].val)
            r--;
        deq[r++]=node(a[i],i);
        if(i<k)continue;
        printf("%d",deq[l].val);
        if(i!=n)printf(" ");
        while(r>l && deq[l].id<=i-k+1)l++;
    }
    l=0,r=0;
    printf("\n");
    for(int i=1; i<=n; i++)
    {
        while(r>l && a[i]>=deq[r-1].val)
            r--;
        deq[r++]=node(a[i],i);
        if(i<k)continue;
        printf("%d",deq[l].val);
        if(i!=n)printf(" ");
        while(r>l && deq[l].id<=i-k+1)l++;
    }
    return 0;
}

相关文章

  • Algorithm小白入门 -- 队列和栈

    队列和栈队列实现栈、栈实现队列单调栈单调队列运用栈去重 1. 队列实现栈、栈实现队列 队列是一种先进先出的数据结构...

  • 单调队列&单调栈

    就是一些很神奇的数据结构 A:最大矩形 题目: 给一个直方图,求直方图中的最大矩形的面积。例如,下面这个图片中直方...

  • 单调栈和应用实践

    什么是单调栈 单调栈的定义:单调栈即满足单调性的栈结构。与单调队列相比,其只在一端进行进出。 如何使用单调栈 单调...

  • 单调 栈&&队列

    题目链接:Largest Rectangle in a Histogram 单调栈: 题目链接:Imbalance...

  • Java版算法模版总结(2)

    本次233酱介绍下单调栈、单调队列、并查集、KMP算法,欢迎交流指正~ 单调栈 「单调栈」首先是一种基于栈的数据结...

  • 4.数据结构(链表,栈,队列,单调栈、单调队列、KMP)

  • 算法进阶二

    BFPRT算法: 介绍窗口以及窗口内最大值或最小值的更新结构(单调双向队列) 介绍单调栈结构

  • 栈和队列

    用栈定义队列(出入栈) 用队列定义栈(数据队列和辅助队列)

  • 1.单调栈

    一、单调栈定义 单调栈(monotone-stack)是指栈内元素(栈底到栈顶)都是(严格)单调递增或者单调递减的...

  • 单调栈 2020-06-12(未经允许,禁止转载)

    1.单调栈 指栈内元素保持单调性的栈结构,分为单调增栈(栈底到栈顶元素递增)和单调减栈(栈底到栈顶元素递减) 2....

网友评论

      本文标题:单调 栈&&队列

      本文链接:https://www.haomeiwen.com/subject/munnqxtx.html