【c++】单调队列(超详细)

本文详细介绍了单调队列的概念,包括单调递增和递减队列的维护方法,并通过三个例题(nkoj 2152、nkoj 2149、nkoj 5559)展示了单调队列在解决滑动窗口最大值/最小值、成本优化和静音检测等问题中的应用。文章提供了清晰的思路和相关代码片段。
摘要由CSDN通过智能技术生成

什么叫单调?
• 一些数据从小到大排列 —— 单调递增
• 从大到小排列 —— 单调递减


单调队列
• 单调递增的队列:在队列的基础上,时刻保持队列中的元素单调递增。
• 单调递减的队列:在队列的基础上,时刻保持队列中的元素单调递减。


怎么做到?
• 除了队首可以出队外,新增一个在队尾出队的操作;
• 新元素要进队,先让不满足单调性的元素从队尾出队。

举个例子
• 元素是整数,单调递增的队列,允许重复元素
• 一开始是个空队列
• 数字 3进队                                 空队列,直接进队
• 数字 5进队                                 能保持单调性,直接进队
• 数字 8进队                                 能保持单调性,直接进队
• 数字 5进队                                 不能保持单调性,先将 8出队,再让 5进队
• 出队                                            数字 3出队
• 数字 9进队                                 能保持单调性,直接进队
• 数字 4进队                                 先让 5,5,9 都出队,再让 4进队
• 出队                                           数字 4出队

单调队列需要用到一个用C++ 自带的双端队列 deque,它可以从队首和队尾加入或删除元素。

deque<int> q;

性质 1:
• 一个元素进队时,从队尾删除了一些元素
• 删完后,自己入队之前,“先进队的元素中最后一个比自己小的”恰好在队尾
• 性质 2:
• 一个元素进队时,从队尾删除了一些元素
• 自己是它们的“后进队的元素中第一个比自己小的”

例题:

nkoj 2152

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hear the Wind Sing.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值