填坑行动13-单调栈和单调队列

单调栈

栈相信大家都学过,但是单调栈或许就有人没有学过了。
单调栈并不是指栈里边是有序的,而是指出战顺序是有序的。
单调栈入栈的伪代码如下(这里的单调栈是递增的):

while(当前元素>栈顶元素&&栈不为空) 栈顶元素出栈
当前元素入栈

一句话,一个选手比你强,还比你小,你就被踢出去了,真残忍,当然,只要你足够强,你就永远不会被踢出去。
作用:寻找一个数组 \(f\) 中,比 \(f\) 大或小并且下标比当前数字小或大的一个数字。

单调队列

单调队列的作用和单调栈一样,但是单调队列维护的是一个长度一定的区间的最值。
伪代码如下(这里维护最大值):

while(队首的下标<=当前点的下标-区间大小&&队列不为空) 队首出队
while(队尾<当前点&&队列不为空) 队尾出队
当前元素进队

总之,一个选手比你小,还比你强,你就无法战胜它了,这也是单调队列一个令人心酸的梗。(感觉要被单调队列了啊QAQ)
当然,就算你再强,你也终有一天会被踢出去。
感觉OIers都处于同一个单调队列之中,而我快要被单调队列了

作用

单调队列的作用还是比较广的,简单的来讲,维护区间最值,往往用于DP的优化,例如多重背包可以采用单调队列优化,这样原来的 \(\Theta\left(nmk\right)\) 就可以优化成 \(\Theta\left(nm\right)\) 了。

posted @ 2021-02-15 21:52  jiangtaizhe001  阅读(36)  评论(0编辑  收藏  举报