浅谈单调队列
本篇随笔简单讲解一下算法竞赛中的一种数据结构—单调队列。
与浅谈单调栈是姐妹篇,同样需要前置知识...你得知道队列是啥,然后单调这个词啥意思。
一、单调队列的概念
单调队列。
就是前置知识加和。
单调+队列。
也就是说,对于这个单调队列来讲,队列中的元素是满足单调性的。
那么当然有单调递增队列和单调递减队列等等的分类。
这就是单调队列了。
需要注意的一点是,这与普通的队列小有不同,普通队列要从尾入,从头出。但单调队列由于要维护单调性,需要从尾入,从头从尾都能出。也就是,如果要用C++STL的话,要用deque。
二、单调队列的应用
单调队列的概念非常简单,那么它的精髓就在于应用,也就是在队列上加了个单调性,它能够支持解决的问题有什么变化。
单调队列所维护的问题是动态区间最大、最小值。也就是我们熟悉的“滑动窗口”。
当然,因为不带修,可以考虑用树状数组、线段树、ST表等各种log算法水。但是数据范围稍大一些,不用(O(N))算法想过这道题,就是痴心妄想。
动态区间最大最小值维护的精髓就是:直接取队首元素,就是答案。那么为了维护这个队首元素最大/最小,我们要采取如下的维护策略:首先,对于新加入元素,如果不符合单调性质,就从队尾弹到符合为止,如果符合性质直接入队。但是由于像滑动窗口等题目还会有其他限制,比如不能让超出范围的最小值继续成为最小值。那么这个时候要在队列中同时维护这个限制,然后从队首出队。
这就是单调队列了。
三、单调队列优化DP
这是单独的一个部分。我们会开单独的博客进行讲解: