码迷,mamicode.com
首页 > 编程语言 > 详细

从0开始学算法--数据结构(2.4双端队列与单调队列)

时间:2019-10-21 11:25:28      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:style   alt   取出   bsp   基础上   ima   mil   http   printf   

双端队列是特殊的队列,它与队列不同的是可以将元素加入头或尾,可以从头或尾取出元素(滑稽-这部就是栈和队列结合了吗)。

c++标准库

头文件

#include<deque>

定义

deque<int>deq;

取出队头,尾元素

deq.pop_front();
deq.pop_back();

访问队头,尾元素

deq.front();
deq.back();

向队头,尾加入元素

deq.push_front(x);
deq.push_back(x);

单调队列是在队列的基础上使它保持有序,与单调栈类似,所以它反应的也是一个区间内的最值问题

例:poj-2823

技术图片



技术图片

 

 

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <deque>
#include <map>

using namespace std;

const int maxn=1e6+10;
int a[maxn];
int b[maxn];

struct aa{
    int a;
    int i;
    aa(){}
    aa(int x,int y):a(x),i(y){}
};
deque<aa>x;

int n,m;

int main(){
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    for(int i=0;i<m-1;i++){
        if(x.empty())x.push_back(aa(a[i],i));
        else{
            aa w=x.back();
            while(!x.empty()&&w.a>=a[i]){
                x.pop_back();
                if(!x.empty())
                    w=x.back();
            }
            x.push_back(aa(a[i],i));
        }
    }
    int k=0;
    for(int i=m-1;i<n;i++){
        aa w;
        if(!x.empty())w=x.front();
        while(!x.empty()&&w.i<=i-m){
                //printf("%d ",w.a);
            x.pop_front();
            if(!x.empty())
                w=x.front();
        }
        if(x.empty())x.push_back(aa(a[i],i));
        else{
            w=x.back();
            while(!x.empty()&&w.a>=a[i]){
                    //printf("%d ",w.a);
                x.pop_back();
                if(!x.empty())
                    w=x.back();
            }
            x.push_back(aa(a[i],i));
        }
        w=x.front();
        b[k++]=w.a;
    }
    for(int i=0;i<k;i++){
        if(i!=k-1)printf("%d ",b[i]);
        else printf("%d\n",b[i]);
    }




    while(!x.empty())x.pop_back();

    for(int i=0;i<m-1;i++){
        if(x.empty())x.push_back(aa(a[i],i));
        else{
            aa w=x.back();
            while(!x.empty()&&w.a<=a[i]){
                x.pop_back();
                if(!x.empty())
                    w=x.back();
            }
            x.push_back(aa(a[i],i));
        }
    }

    k=0;
    for(int i=m-1;i<n;i++){
        aa w;
        if(!x.empty())w=x.front();
        while(!x.empty()&&w.i<=i-m){
                //printf("%d ",w.a);
            x.pop_front();
            if(!x.empty())
                w=x.front();
        }

        if(x.empty())x.push_back(aa(a[i],i));
        else{
            w=x.back();
            while(!x.empty()&&w.a<=a[i]){
                    //printf("%d ",w.a);
                x.pop_back();
                if(!x.empty())
                    w=x.back();
            }
            x.push_back(aa(a[i],i));
        }
        w=x.front();
        b[k++]=w.a;
    }
    for(int i=0;i<k;i++){
        if(i!=k-1)printf("%d ",b[i]);
        else printf("%d\n",b[i]);
    }
    return 0;
}

从0开始学算法--数据结构(2.4双端队列与单调队列)

标签:style   alt   取出   bsp   基础上   ima   mil   http   printf   

原文地址:https://www.cnblogs.com/wz-archer/p/11712243.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!