https://wenku.baidu.com/view/ef259400bed5b9f3f90f1c3a.html
先丢一个感觉超好用论文。 在之前我也写过两道用单调队列优化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]相当于不存在了。
http://blog.csdn.net/flanoc/article/details/72860395
不要脸地丢个自己写的(代码超丑的)题解。 维护区间最大值和最小值然后瞎搞就行。
其实也没说的那么玄乎,大概就是a[][2],在a[][0]相同时,优先考虑a[][1]的大小。 还是不要脸地扔个题解。
http://blog.csdn.net/flanoc/article/details/72870236
论文中的题目 http://blog.csdn.net/Flanoc/article/details/72918520 待续(坑了