单调队列

Posted tbdemons

tags:

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

看下面一个例题:
给定一个序列,求所有区间长度为L的区间的最大值和最小值。
n,m<=5000000
这个题有啥做法?
O(nlogn)的线段树
O(nlogn)的带删除优先队列(对顶堆)
还能再快一点吗?
O(n)-O(1)RMQ代替线段树
还能再好写一点吗? O(n)的滑动窗口
在队列中维护一个单调性,换而言之让这个队列始终保持里面的元素拥有单调递增/单调递减的属性。
也就是说,维护这L个元素的最大值/最小值即可。
考虑到每个元素最多被进出队1次,因此这是一个O(n)的算法

//wei daima 
#include<iostream>

using namespace std;
const int N=50000010;
int q[N],l=1,r=1,a[N],mx,mn,inq[N],n,m;
inline void ins(int x)

    while(l<r&&q[r-1]<=a[x])  r--;
    q[r]=a[x];inq[r]=x;r++;

int getmax(int cur)

    for(l<r;l++)if(cur-inq[l]<m) return q[l] ;

int main()

    return 0;

以上是关于单调队列的主要内容,如果未能解决你的问题,请参考以下文章

单调队列 单调栈

优先队列和单调队列一样吗?

单调队列以及单调队列优化DP

数据结构——单调栈&单调队列(解决滑动窗口问题)

单调队列模板

单调队列单调栈