单调队列总结

喵喵喵

也是来写单调队列了喵

举个例子

小鸽子喜欢玩很多游戏,但是有的时候

小鸽子不得不退而求其次(并非其次)

那么怎么让小鸽子知道他在每段时刻上线能玩到的最佳游戏呢


正片开始

我们发现窗口的滑动仅仅只改变了一位

如果是求和的话那就简单了,无论是前缀和还是其他乱七八糟的做法都可以

但是我们这里主要讲一下动态维护的方式:去掉前一个过期元素,加入新元素

好了,那么求极值怎么动态维护呢

观察一下

欸,问题来了

我们发现答案对应下标是只增不降的

为什么呢

如果有 i < j , a_i < a_j 时 除非 a_i 过期,否则不可能选 a_j (不代表一定会选 a_i ),a_i > a_j 时 就不会选 a_i (不代表一定会选 a_j

那么这个区间就可以变成这样

我去这不就是双指针吗

考虑什么时候队列可以往前

就是我比你小,还比你强

{203CD6FE-182A-4870-8247-E3474006E4DC}

(在我之前加入队列的一定比我下标小)

{691C8790-07A8-4C36-86DF-DF306F7BE26C}

把过期的扔掉

那么此时,队首元素就是集“未过期”和“赛高赛强”于一体

直接取出即答案


神秘花絮

image

当场切了一下

比较朴素

大家可以去找一点点单调队列优化DP玩玩

拜拜:waving_hand:

2 个赞