006. 滑动窗口 /【模板】单调队列(洛谷P1886)

news/2024/12/28 20:15:39/文章来源:https://www.cnblogs.com/zyihan-crz/p/18637892

006. 滑动窗口 /【模板】单调队列(洛谷P1886)

题目描述

有一个长为 \(n\) 的序列 \(a\),以及一个大小为 \(k\) 的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。

例如,对于序列 \([1,3,-1,-3,5,3,6,7]\) 以及 \(k = 3\),有如下过程:

\[\def\arraystretch{1.2} \begin{array}{|c|c|c|}\hline \textsf{窗口位置} & \textsf{最小值} & \textsf{最大值} \\ \hline \verb![1 3 -1] -3 5 3 6 7 ! & -1 & 3 \\ \hline \verb! 1 [3 -1 -3] 5 3 6 7 ! & -3 & 3 \\ \hline \verb! 1 3 [-1 -3 5] 3 6 7 ! & -3 & 5 \\ \hline \verb! 1 3 -1 [-3 5 3] 6 7 ! & -3 & 5 \\ \hline \verb! 1 3 -1 -3 [5 3 6] 7 ! & 3 & 6 \\ \hline \verb! 1 3 -1 -3 5 [3 6 7]! & 3 & 7 \\ \hline \end{array} \]

输入格式

输入一共有两行,第一行有两个正整数 \(n,k\)
第二行 \(n\) 个整数,表示序列 \(a\)

输出格式

输出共两行,第一行为每次窗口滑动的最小值
第二行为每次窗口滑动的最大值

样例 #1

样例输入 #1

8 3
1 3 -1 -3 5 3 6 7

样例输出 #1

-1 -3 -3 -3 3 3
3 3 5 5 6 7

提示

【数据范围】
对于 \(50\%\) 的数据,\(1 \le n \le 10^5\)
对于 \(100\%\) 的数据,\(1\le k \le n \le 10^6\)\(a_i \in [-2^{31},2^{31})\)

题解

这是一道单调双向队列的板子题。


先看题目,所给的数列并不符合严格的单调性

所以怎么做

暴搜用双向队列确保严格的单调性


8 31 3 -1 -3 5 3 6 7

拿样例举例(最小值)

开始1入列(不要在for之前入,会影响后续元素的入列)

我就是这样卡了一晚上

3同理

当-1入列时,前面的1,3要队尾出列

这样可以维护双向队列的严格单调性,并且省去了用整个队列判断的时间。

-3入队,把前面全部弹走。

5入队时,虽然它比-3 劣,但由于它处于队尾,单调性依旧维护

3入队,队尾弹走5

注意此时窗口已经为3,在6入队后,要弹走-3

因为已经超过范围

这样最小值变为-3了

最大值换个符号,ctrl+V一遍过

注意一些细节点,此题不难

虽然我卡了一晚上

最后AC代码附上

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<deque>
#include<iostream>using namespace::std;int n,k,num[1000009],t;
deque <int> a;//单调队列的实现依靠双向队列int main()
{cin>>n>>k;for(int i=0;i<n;i++)cin>>num[i];//读入t=0;//队头在num数组中的位置,指针for(int i=0;i<n;i++){while(!a.empty()&&a.back()>=num[i]) a.pop_back();//不优,弹出a.push_back(num[i]); if(i-t>=k&&num[t]==a.front()) {t++;a.pop_front();}if(i-t>=k&&num[t]!=a.front()) t++;//如果num的t在队列已经弹掉,就不用弹出if(i>=k-1) cout<<a.front()<<' ';//注意只在窗口完全进入后再输出}cout<<endl;	a.clear();//清空队列,重新计算t=0;for(int i=0;i<n;i++){while(!a.empty()&&a.back()<=num[i]) a.pop_back();a.push_back(num[i]); if(i-t>=k&&num[t]==a.front()) {t++;a.pop_front();}if(i-t>=k&&num[t]!=a.front()) t++;if(i>=k-1) cout<<a.front()<<' ';}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/860523.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记 - 汉明码

汉明码属于一种具备纠错功能的线性分组码。 在数据传输时,受外界干扰影响,单个比特可能产生差错。汉明码借助添加的冗余监督位,依照特定规则精准判断出错比特位,进而完成纠正,确保信息恢复如初,宛如给数据披上一层“防护甲”,使其即便处于复杂环境,也能维持精准可靠,在…

学习笔记 - 摩斯电码

摩斯电码由美国人塞缪尔莫尔斯等人发明,仅用“”(点)与“-”(划)两种符号,按不同排列组合来代表英文字母、数字和标点。起初应用于有线电报,后应用到无线电通信,曾长期担任关键角色。如今,虽因通信技术革新而不再主流,但在业余无线电爱好者群体中依旧流行,紧急救援时…

2024第一届Solar杯应急响应挑战赛WP

对于一个只学了2个月的小白来说这种比赛难度还是太高了,还要沉淀一下QAQ 内存取证-1 题目描述 题目文件:SERVER-2008-20241220-162057 请找到rdp连接的跳板地址 flag格式 flag{1.1.1.1} 先imageinfo然后netscan F:\CTF软件合集\Misc杂项\隐写工具\取证类\volatility\Volatili…

App信息收集

引子:上一章主要介绍了信息收集中的Web信息收集,包括要收集什么信息、该怎样去做等内容。而本章则简单介绍一下当目标为App时该如何进行信息收集。由于本篇章为信息收集篇,因此很多内容笔者并没有深究(ps:其实是深究不明白),或许等一轮学完后再回头看时会明白很多吧。免…

基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真

1.算法运行效果图预览 (完整程序运行后无水印)PSO优化过程: PSO优化前后,模型训练对比: 数据预测对比: 误差回归对比: 2.算法运行软件版本 matlab2022a3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)LR = g1(1); NN1 = floor(g1…

软件工程我依然爱你

用一个词总结软工实践课程——Never forget!!!😚😚😚 前言现在是2024年12月27号下午4点,是我考完软件工程课程的四小时,也是我软工实践结束的第27天。我竟莫名对软件工程有点不舍,特别是我们倾注大量心血的项目——福小研,我愿称之为我心里最好的项目之一,或许它…

2024省选联测1

2024省选联测1题目来源: 2024省选联测1 \(T1\) HZTG5808. interval \(40pts\)原题: QOJ 1173. Knowledge Is..考虑按照左端点升序排序后反悔贪心。分别维护已经匹配的区间对和未被匹配的区间,若当前区间 \(a\) 可以和前面剩余的未被匹配的区间匹配则直接匹配;否则尝试找到一…

2024-2025-1 20241407《计算机基础与程序设计》第十四周学习总结

作业信息这个作业属于哪个课程 2024-2025-1计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十四周作业这个作业的目标 学习二进制文件和文本文件,文件的打开和关闭,顺序读写与随机读写,标准输入和输出及其重定向作业正文 本博客教材学习内容总结…

GraphMAE2(解码增强型掩码自监督图学习器)

GraphMAE2: A Decoding-Enhanced Masked Self-Supervised Graph Learner 解码增强型掩码自监督图学习器 背景 ​ 近年来,自监督学习(Self-supervised Learning,SSL)得到了广泛的探索,特别是生成式自监督学习在自然语言处理以及其他人工智能领域已经取得了新兴的成功,像…

PTA第7~8次大作业分析及总结

一、前言 本次Blog为第七~八次大作业的总结。两次大作业主要考察抽象类及继承方面的相关内容,是在第六次大作业基础上的进一步升级,难度大幅提升,由于前面的作业我没有很好地完成,这两次大作业也没有拿到好成绩,这也算是提醒我:在进行一个设计时要提前为后续更加预留空间…

python3网络爬虫开发实战-第2版PDF免费下载

本书介绍了如何利用 Python 3 开发网络爬虫。本书为第 2 版,相比于第 1 版,为每个知识点的实战项目配备了针对性的练习平台,避免了案例过期的问题。另外,主要增加了异步爬虫、JavaScript 逆向、App 逆向、页面智能解析、深度学习识别验证码、Kubernetes 运维及部署等知识点…

Java大作业总结

Java大作业总结 目录Java大作业总结一.前言第七次大作业1.设计与分析2.踩坑心得(一)电阻值处理(二)设备状态更新顺序3.改进建议(一)错误处理与异常机制(二)性能优化(三)代码结构调整第八次大作业1.设计与分析2.踩坑心得3.改进建议期末总结 一.前言 这2次大作业都是前…