模板 - 数据结构 - 单调队列/单调栈

Posted yinku

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板 - 数据结构 - 单调队列/单调栈相关的知识,希望对你有一定的参考价值。

一道例题,给定一串数字,求每连续k个数字的最大、最小值。

思路:初始化一个初始长度为k的单调队列,按从左到右加入元素,同时满足这个队列中的元素是递减的(也就是假如某个数被两个距离不超过k的大于他的数夹着,他会被从队尾调出队列)。得到最大值。

向右移动一格,假如队首离开范围,出队。往队尾加入元素前,把队尾的所有比它小的元素全部出队。

得到新的最大值。

#include<bits/stdc++.h>
using namespace std;

struct Monotone_Queue{
    deque<int> q;

    void push(int value){
        while(!q.empty()&&q.back()<value){
            q.pop_back();
        }
        q.push_back(value);
    }

    int front(){
        return q.front();
    }

    void pop(){
        q.pop_front();
    }
};

struct Monotone_Stack{
    stack<int> s;

    void push(int value){
        while(!s.empty()&&s.top()<value){
            s.pop();
        }
        s.push(value);
    }

    int top(){
        return s.top();
    }

    void pop(){
        s.pop();
    }
};

 

以上是关于模板 - 数据结构 - 单调队列/单调栈的主要内容,如果未能解决你的问题,请参考以下文章

单调栈&单调队列

7.14 单调栈 单调队列 +dp优化

单调队列单调栈

单调队列与单调栈用法详解

线性表--单调栈

线性表--单调栈