标签:
单调队列,就是队列里的元素是单调递增或者单调递减的。
那就有人问了,这和优先队列有什么区别。
单调队列里的单调递增(递减)不止是值的单调递增(递减),下标也是单调递增的。
我们来看单调队列怎么维护的,就知道单调队列是什么东西了。
这里以单调递增队列为例。
将数组a[1->n]里面的元素依次入队列。 如果要入队的元素大于队尾元素,那么就将该元素入队列, 如果该元素小于队伍元素,
那么就将队尾元素不断地出队列,直到队伍元素大于该元素,或者队列为空为止。
所以单调递增队列里面的元素不止值是递增的,下标也是递增的
要我们求队列中的最大值,因为队列是无序的,所以每次查询的复杂度都是O(N),这肯定是不行的
所以我们只要维护一个单调递减队列就行了(因为单调递减队列可以保留最大值,而单调递增队列不行,比如 1 2 4 3 如果用单调递增队列,那么当3插入时,队列中只有3)
对于Q命令,如果队列不为空,我们只要输出队首元素即可。
对于G命令,将cnt2++, 然后将队列中id<=cnt2的元素出队列
对于C命令, 即维护一个单调队列
为什么当加入一个元素时,当队尾元素小于插入元素时,队尾元素可以删去呢。 因为插入的元素比队尾元素大,且序号比队尾元素更靠后,
所以当该元素存在时,是不会选取队尾元素的,即该元素是更优的,所以可以删除队尾元素
标签:
原文地址:http://www.cnblogs.com/justPassBy/p/4518345.html