当前位置: 首页 > news >正文

洛谷 滑动窗口 /【模板】单调队列

题目描述

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

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

窗口位置[1   3  -1] -3   5   3   6   7  1  [3  -1  -3]  5   3   6   7  1   3 [-1  -3   5]  3   6   7  1   3  -1 [-3   5   3]  6   7  1   3  -1  -3  [5   3   6]  7  1   3  -1  -3   5  [3   6   7]​最小值−1−3−3−333​最大值335567​​

输入格式

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

输出格式

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

输入输出样例

输入 #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≤n≤105;
对于 100% 的数据,1≤k≤n≤106,ai​∈[−231,231)。

代码1:超时??因为当n = 10^6,k = 10^6,循环10^12次,超时。

#include <bits/stdc++.h>
#define MX 1000005
using namespace std;
int a[MX],b[MX],c[MX];
int main() {
int n,k;
cin>>n>>k;
for(int i = 1; i <= n; i++) {
cin>>a[i];
}
for(int left = 1; left+k-1<= n; left++) {
int mn = INT_MAX,mx = INT_MIN;
for(int right = left; right <= left+k-1 && right <= n; right++) {
mn = min(mn,a[right]);
mx = max(mx,a[right]);
}
b[left] = mn;
c[left] = mx;
}
for(int i = 1; i <= n+1-k; i++) {
cout<<b[i]<<" ";
}
cout<<endl;
for(int i = 1; i <= n+1-k; i++) {
cout<<c[i]<<" ";
}
cout<<endl;
return 0;
}
优化:使用更高效的数据结构维护最大值和最小值。

代码2:单调队列

#include <bits/stdc++.h>
#define MX 1000005
using namespace std;
//单调队列模板题
int a[MX];
int main() {
int n,k;
cin>>n>>k;
deque<int> mn_deque,mx_deque;
vector<int> mn,mx;
for(int i = 1; i <= n; i++) {
cin>>a[i];
}
for(int i = 1; i <= n; i++) {
//维护最小值队列
while(!mn_deque.empty() && mn_deque.front() < i - k + 1) {
mn_deque.pop_front();
}
while(!mn_deque.empty() && a[mn_deque.back()] >= a[i]) {
mn_deque.pop_back();
}
mn_deque.push_back(i);
//维护最大值队列
while(!mx_deque.empty() && mx_deque.front() < i - k + 1) {
mx_deque.pop_front();
}
while(!mx_deque.empty() && a[mx_deque.back()] <= a[i]) {
mx_deque.pop_back();
}
mx_deque.push_back(i);
if(i >= k) {
mn.push_back(a[mn_deque.front()]);
mx.push_back(a[mx_deque.front()]);
}
}
for(auto x : mn) {
cout<<x<<" ";
}
cout<<endl;
for(auto x : mx) {
cout<<x<<" ";
}
cout<<endl;
return 0;
}

http://www.dtcms.com/a/322978.html

相关文章:

  • 揭秘MyBatis核心类MappedStatement
  • Java异常:认识异常、异常的作用、自定义异常
  • ChatGPT 5的编程能力宣传言过其实
  • 97-基于Python的大众点评数据分析预测系统
  • 七、《Serverless架构:按毫秒计费的成本革命》--从新浪AI推理平台50%效能提升看无服务器本质
  • 数据结构——优先级队列(PriorityQueue):一文解决 Top K 问题!
  • 可视化大屏 SDK 数据结构设计:从拖拽组件到最终渲染的全链路
  • 2025-08-09 李沐深度学习13——经典卷积神经网络 (1)
  • 嵌入式知识日常问题记录及用法总结(一)
  • C++2024 年一级
  • Vue3 学习教程,从入门到精通,Vue 3 + Tailwind CSS 全面知识点与案例详解(31)
  • buuctf:inndy_echo、actf_2019_babystack
  • 花生4CL基因家族鉴定及对干旱与盐胁迫响应分析--文献精读157
  • 【AI论文】种子扩散模型:一种具备高速推理能力的大规模扩散语言模型
  • 智慧农业-无人机视角庄稼倒伏农作物倒伏识别分割数据集labelme格式541张1类别
  • C语言指针完全指南:从入门到精通
  • Selenium使用超全指南
  • OpenCV图像裁剪与 ROI 操作
  • 全志刷机工具:PhoenixSuit-全志芯片处理器-刷机工具安装包及最详细使用教程指南
  • Python day39
  • Web3: 用ERC-1400革新公司股权激励
  • 【原创】基于 Flask 的简单文件收集器
  • 【33】C#实战篇——点击按钮弹出指定路径对话框,选择指定类型文件;;;文件过滤器显示指定的一种文件,几种类型文件 同时显示
  • Pytest中实现自动生成测试用例脚本代码
  • 扩散LLM推理新范式:打破生成长度限制,实现动态自适应调节
  • 在ubuntu服务器下安装cuda和cudnn(笔记)
  • ImageJ 实用技巧:通过 Overlay 实现图像透明标记的完整教程
  • NTP /Chrony 网络时间协议
  • 当配置项只支持传入数字,即无法指定单位为rem,需要rem转px
  • 本地连接跳板机