单调队列以及单调队列优化DP
单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的。 单调队列的一般应用: 1.维护区间最值 2.优化DP 例题引入: 求m区间内的最小值: https://www.luogu.org/problemnew/show/P1440 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值。若前面的数不足m项则从第1个数开始,若前面没有数则输出0。 例题解答: 首先看到题目可以很快想到O(NM),对于2*10^6这样的数据无疑要TLE的; 接下来考虑用单调队列,因为每一个答案只与当前下标的前m个有关,所以可以用单调队列维护前m的个最小值, 考虑如何实现该维护的过程?? 显然当前下标X的m个以前的元素(即下标小于X-M+1的元素)肯定对答案没有贡献,所以可以将其从单调队列中删除。 对于两个元素A,B,下标分别为a,b,如果有A>=B&&a<b那么B留在队列里肯定优于A,因此可以将A删除。 维护队首:如果队首已经是当前元素的m个之前,将head++,弹出队首元素 维护队尾:比较q[tail]与当前元素的大小,若当前元素更优tail++,弹出队尾元素