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;

}

 

你可能感兴趣的:(poj)