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

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

那究竟是一个什么东西?

还是经典例题.洛谷p1440
给出一个长度为n的序列,按顺序求每连续k个数字中的最小值.
可以暴力,复杂度 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);//加入之.
  }
}

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

猜你喜欢

转载自blog.csdn.net/qq_31908675/article/details/81142470
今日推荐