首页 > 其他分享 >单调队列

单调队列

时间:2023-03-13 22:55:06浏览次数:33  
标签:队尾 窗口 队列 tt int hh 单调

 

 

 重点:将队列中没有用的元素删除。

如果在窗口中存在i<j,ai>aj,那么在窗口向右移动的过程中,只要aj存在,那么ai就永远不可能成为最小值。应该被移除。

因此,当窗口移动到aj的那一刻,ai以及窗口中一切大于或者等于aj的元素都应该被移出队列。形成一个单调递增的队列,找队首就是最小值。找最大值的话反过来就行。

 #include<iostream>

#include<queue>

using namespace std;

const int N=1e6+10;

int hh,tt=-1;//队列要定义队头和队尾

int n,k;

int a[N];

int q[N];//队列

int main(){

cin>>n>>k;

for(int i=0;i<n;i++){

cin>>a[i];

}

//最小值

for(int i=0;i<n;i++){

if(hh<=tt && q[hh]<i-k+1) hh++;//队头超出窗口,出队列

while(hh<=tt && a[q[hh]]>=a[i]) tt--;//如果窗口中的值大于即将进队列的元素,则删去。直到删到窗口中的值小于即将进队列的那个元素为止,形成一个单调递增的队列。

q[++tt]=i;//即将进队列的那个值进队列

if(i>=k-1) cout<<a[q[hh]]<<' ';//保证窗口中有k的数字时,开始输出队头(是最小值)。(i-1>=k)

puts("");//空格

hh=0,tt=-1;//重新给队头和队尾赋值

//开始求最大值 就是判断如果进队列的那个值大于队尾的值,则删除队尾,直到形成一个单调递减的队列。然后输出队头就是最大值。

for(int i=0;i<n;i++){

if(hh<=tt && q[hh]<i-k+1) hh++;

while(hh<=tt && a[q[hh]]>=a[i]) tt--;

q[++tt]=i;

if(i>=k-1) cout<<a[q[hh]]<<' ';

}

return 0;

}

 

标签:队尾,窗口,队列,tt,int,hh,单调
From: https://www.cnblogs.com/chenxinyue/p/17205665.html

相关文章

  • C#中定义自己的消费队列(下)
    一背景在上一篇中我们介绍了一个关于使用C#中的Queue来定义自己的消费队列,这篇文章我将再次使用Queue来定义另外一种消费队列,这个队列中会使用到System.Threading.Timer......
  • 第八章 多级反馈队列调度
    1.限制作业长度并关闭IOpython3mlfq.py-j2-n2-cpython3mlfq.py--jlist0,10,0:0,5,0-n2-c2.实现书上示例python3mlfq.py-l0,200,0-cpython3mlfq.py-......
  • day10 打卡232. 用栈实现队列 225. 用队列实现栈
    day10打卡232.用栈实现队列225.用队列实现栈232.用栈实现队列232题目链接classMyQueue{//管理进的元素Stack<Integer>stackIn;//管理出的元素......
  • 2023-03-10 Java中使用ArrayDeque实现栈和队列
    栈和队列的实现实际上完全可以用JDK自带的类ArrayDeque来实现作为队列使用publicabstractbooleanadd(EparamE);//加入元素到队尾publicabstractbooleanoffe......
  • 【Linux】Ubuntu系列简单调优
    是不是觉得你的Ubuntu比别人的慢?是不是并发数不够高?是不是启动个服务慢到怀疑人生?下面是我从网上收集回来的Ubuntu系列的简单性能配置,希望能够帮助到更多的人。1.修改/etc/......
  • TZOJ 3196: 看病要排队 优先队列
    描述看病要排队这个是地球人都知道的常识。不过经过细心的0068的观察,他发现了医院里排队还是有讲究的。0068所去的医院有三个医生(汗,这么少)同时看病。而看病的人病情有轻......
  • 微服务学习计划——消息队列
    微服务学习计划——消息队列我们在微服务中一个命令会逐渐调用各个微服务,但如果一一调用不仅需要微服务实时同步交互还会浪费效率所以我们通常会采用MQ,也就是消息队列Mes......
  • 第127篇:异步函数(async和await)练习题(异步,消息队列)
    好家伙,本篇为做题思考书接上文 题目如下: 1.请给出下列代码的输出结果,并配合"消息队列"写出相关解释asyncfunctionfoo(){console.log(2);console.lo......
  • 微服务学习计划——消息队列
    微服务学习计划——消息队列我们在微服务中一个命令会逐渐调用各个微服务,但如果一一调用不仅需要微服务实时同步交互还会浪费效率所以我们通常会采用MQ,也就是消息队列Mes......
  • 代码随想录算法Day37 | 738.单调递增的数字
    738.单调递增的数字题目链接:738.单调递增的数字-力扣(LeetCode)思路将数字转换成字符数组形式,然后从后向前遍历,当遇到当前这个数大于后一个数的时候,这个数减一,他的后一......