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;
}
原文地址:https://www.cnblogs.com/oneshot/p/4021063.html