浅谈单调队列

浅谈单调队列

本篇随笔简单讲解一下算法竞赛中的一种数据结构—单调队列。

浅谈单调栈是姐妹篇,同样需要前置知识...你得知道队列是啥,然后单调这个词啥意思。


一、单调队列的概念

单调队列。

就是前置知识加和。

单调+队列。

也就是说,对于这个单调队列来讲,队列中的元素是满足单调性的。

那么当然有单调递增队列和单调递减队列等等的分类。

这就是单调队列了。

需要注意的一点是,这与普通的队列小有不同,普通队列要从尾入,从头出。但单调队列由于要维护单调性,需要从尾入,从头从尾都能出。也就是,如果要用C++STL的话,要用deque。


二、单调队列的应用

单调队列的概念非常简单,那么它的精髓就在于应用,也就是在队列上加了个单调性,它能够支持解决的问题有什么变化。

单调队列所维护的问题是动态区间最大、最小值。也就是我们熟悉的“滑动窗口”。

当然,因为不带修,可以考虑用树状数组、线段树、ST表等各种log算法水。但是数据范围稍大一些,不用\(O(N)\)算法想过这道题,就是痴心妄想。

动态区间最大最小值维护的精髓就是:直接取队首元素,就是答案。那么为了维护这个队首元素最大/最小,我们要采取如下的维护策略:首先,对于新加入元素,如果不符合单调性质,就从队尾弹到符合为止,如果符合性质直接入队。但是由于像滑动窗口等题目还会有其他限制,比如不能让超出范围的最小值继续成为最小值。那么这个时候要在队列中同时维护这个限制,然后从队首出队。

这就是单调队列了。


三、单调队列优化DP

这是单独的一个部分。我们会开单独的博客进行讲解:

浅谈单调队列优化DP

posted @ 2020-11-04 16:51  Seaway-Fu  阅读(163)  评论(1编辑  收藏  举报