单调队列,单调栈等单调数据结构

本文介绍了一种利用双端队列解决洛谷P1440题目中的滑动窗口最小值问题的方法。通过维持队列内元素的单调递增,并确保每个元素的时间戳不超过当前时间减去窗口大小k,从而实现在每个时间戳快速找到最小值的目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天我们来搞一个好玩又好吃的东西.

那究竟是一个什么东西?

还是经典例题.洛谷p1440
给出一个长度为n的序列,按顺序求每连续k个数字中的最小值.
可以暴力,复杂度 O(n2) O ( n 2 ) .
这个时候我们考虑一个双端队列并模拟以下的样例.

7 3
3 4 5 1 2 8 7

我们设第i个数字被加入队列的时候为第i个时间戳.
这个队列中每一个时间戳里,队列里的元素是单调递增的,并且里面每一个元素的时间戳都小于或者等于目前的时间-k.
这样非常容易地在每一个时间戳维护队首,它就是最小值.
手膜一下我就不实现了.

如何实现

首先你需要一个双端的队列.
头文件#include<queue>
具体使用方法deque<int> q;
接下来开始瞎搞.
我们还是一步一步解读.

const int yuzu=2e6;
int a[yuzu|10];
deque<int> q;
int main(){
int i,n=read(),m=read();
for (i=1;i<=n;++i){
  a[i]=read();//读入a[i]
  write(a[q.front()]),pl;//输出最大值
  /*接下来这两手必须保证队列非空,否则会re.*/
  for (;!q.empty()&&i-m>=q.front();q.pop_front());
  /*目前的最小值不在当前时间戳范围内,弹掉.*/
  for (;!q.empty()&&a[i]<=a[q.back()];q.pop_back());
  /*末尾的数比要放进去那个大,一个一个全部扔掉.*/
  q.push_back(i);//加入之.
  }
}

单调栈可以见论如何用四种方法扫荡一道题.
谢谢大家.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值