先丢一个感觉超好用论文。
在之前我也写过两道用单调队列优化DP的题解,今天偶然看到了这样一个论文,大概就题目与用法之间写一个总结。
单调队列就是维护一个队列,满足队列里的元素的值与指针都是单调的。
一、维护区间的最大值/最小值
假设这个数列为a[],区间的大小为m。
假如维护最大值那么就维护一个单调递减队列,每次向右找到一个新的位置i时,假如队尾的元素比a[i]小的话,就将队尾元素出队,直到满足递减性便将a[i]入队。同时对于队首,假如它的指针小于i-m+1,那么显然这个数字对于我们所求的区间是无关的,也将它出队。
结束之后,此时显然队首的元素就是所求区间中的最大值,因为这个队列是单调递减的。
对于最小值亦然。
那么,为什么这样子维护队列,就能找到区间的最大值/最小值呢?
对于最大值,我们思考这么一个问题,我们所求的最大值的区间是从i-m+1~i,那我们假设目前的队尾元素是a[j],而且a[j]
<
<
<script type="math/tex" id="MathJax-Element-1"><</script>a[j+1],那么对于j+1之后区间而言,这些区间必然如果包含j那么一定包含j+1,然而a[j+1]
>
>
<script type="math/tex" id="MathJax-Element-2">></script>a[j],对于求最大值而言,显然a[j]相当于不存在了。
不要脸地丢个自己写的(代码超丑的)题解。
维护区间最大值和最小值然后瞎搞就行。
二、同时维护多种单调性
其实也没说的那么玄乎,大概就是a[][2],在a[][0]相同时,优先考虑a[][1]的大小。
还是不要脸地扔个题解。
论文中的题目
http://blog.youkuaiyun.com/Flanoc/article/details/72918520
待续(坑了