• poj2823:单调队列入门题


    今天学习了一下单调队列这种数据结构,思想不是很难

    参考资料:http://www.cnblogs.com/Jason-Damon/archive/2012/04/19/2457889.html

    然后自己写成了类的模板形式,并做了例题poj2823

    代码如下:

    #include <iostream>
    #include <stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<string>
    #include<ctype.h>
    using namespace std;
    #define maxn 10000010
    typedef struct Node
    {
        int val;
        int num;
    }node;
    typedef struct iqueue
    {
        node q[maxn];
        int l,r;
        void ini()
        {
            l=0;
            r=0;
        }
        node front()
        {
            return q[l];
        }
        node pop()
        {
            l++;
            return q[l-1];
        }
        void push(node x)
        {
            if(r==l)
            {
                q[r++]=x;
                return;
            }
            if(x.val>=q[l].val)
            {
                r=l;
                q[r++]=x;
                return;
            }
            while(r>=1&&x.val>=q[r-1].val)
            {
                r--;
            }
            q[r++]=x;
        }
    }Iqueue;
    typedef struct dqueue
    {
        node q[maxn];
        int l,r;
        void ini()
        {
            l=0;
            r=0;
        }
        node front()
        {
            return q[l];
        }
        node pop()
        {
            l++;
            return q[l-1];
        }
        void push(node x)
        {
            if(r==l)
            {
                q[r++]=x;
                return;
            }
            if(x.val<=q[l].val)
            {
                r=l;
                q[r++]=x;
                return;
            }
            while(r>=1&&(x.val<=q[r-1].val))
            {
                r--;
            }
            q[r++]=x;
        }
    }Dqueue;
    int big[1000010];
    int small[1000010];
    Iqueue qi;
    Dqueue qd;
    int main()
    {
        int n,k;
        while(scanf("%d%d",&n,&k)!=EOF)
        {
            node x;
            node s,b;
            int t=0;
            qi.ini();
            qd.ini();
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&x.val);
                x.num=i;
                qi.push(x);
                qd.push(x);
                if(i>=k)
                {
                    b=qi.front();
                    while(b.num<=i-k)
                    {
                        qi.pop();
                        b=qi.front();
                    }
                    s=qd.front();
                    while(s.num<=i-k)
                    {
                        qd.pop();
                        s=qd.front();
                    }
                    big[t]=b.val;
                    small[t++]=s.val;
                }
            }
            for(int i=0;i<t;i++)
            {
                printf("%d",small[i]);
                if(i==t-1)
                    puts("");
                else
                    printf(" ");
            }
            for(int i=0;i<t;i++)
            {
                printf("%d",big[i]);
                if(i==t-1)
                    puts("");
                else
                    printf(" ");
            }
        }
        return 0;
    }
  • 相关阅读:
    CCPC-Wannafly Winter Camp Day4 Div1
    CCPC-Wannafly Winter Camp Day4 Div1
    CCPC-Wannafly Winter Camp Day4 Div1
    CCPC-Wannafly Winter Camp Day5 Div1
    Luogu 1603
    洛谷试炼场
    Codeforces 1100
    Codeforces 1099E
    Codeforces 1099
    Luogu 1093
  • 原文地址:https://www.cnblogs.com/oneshot/p/4021063.html
Copyright © 2020-2023  润新知