填坑行动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) 了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值