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

单调栈

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

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

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

单调队列

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

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

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

作用

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

猜你喜欢

转载自blog.csdn.net/jiangtaizhe/article/details/108082287