码迷,mamicode.com
首页 > 其他好文 > 详细

单调队列

时间:2015-05-20 23:46:05      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

单调队列,就是队列里的元素是单调递增或者单调递减的。

那就有人问了,这和优先队列有什么区别。

单调队列里的单调递增(递减)不止是值的单调递增(递减),下标也是单调递增的。

我们来看单调队列怎么维护的,就知道单调队列是什么东西了。

这里以单调递增队列为例。

将数组a[1->n]里面的元素依次入队列。   如果要入队的元素大于队尾元素,那么就将该元素入队列, 如果该元素小于队伍元素,

那么就将队尾元素不断地出队列,直到队伍元素大于该元素,或者队列为空为止。

所以单调递增队列里面的元素不止值是递增的,下标也是递增的

 

 

foj1894

要我们求队列中的最大值,因为队列是无序的,所以每次查询的复杂度都是O(N),这肯定是不行的

所以我们只要维护一个单调递减队列就行了(因为单调递减队列可以保留最大值,而单调递增队列不行,比如 1 2 4 3  如果用单调递增队列,那么当3插入时,队列中只有3)

对于Q命令,如果队列不为空,我们只要输出队首元素即可。

对于G命令,将cnt2++, 然后将队列中id<=cnt2的元素出队列

对于C命令, 即维护一个单调队列

为什么当加入一个元素时,当队尾元素小于插入元素时,队尾元素可以删去呢。 因为插入的元素比队尾元素大,且序号比队尾元素更靠后,

所以当该元素存在时,是不会选取队尾元素的,即该元素是更优的,所以可以删除队尾元素

单调队列

标签:

原文地址:http://www.cnblogs.com/justPassBy/p/4518345.html

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