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

题解:洛谷 P1886 【模板】单调队列 / 滑动窗口

【题目来源】

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

【题目描述】

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

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

image

【输入】

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

【输出】

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

【输入样例】

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

【输出样例】

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

【算法标签】

《洛谷 P1886 单调队列》 #模拟# #线段树# #单调队列# #队列#

【代码详解】

#include <bits/stdc++.h>
using namespace std;
const int N = 1000006;
int a[N], q[N];  // a: 输入数组, q: 单调队列(存储下标)
int n, k;  // n: 数组长度, k: 滑动窗口大小int main()
{cin >> n >> k;  // 读入n和k// 读入数组for (int i = 1; i <= n; i++)cin >> a[i];// 第一部分:维护窗口最小值int h = 1, t = 0;  // h: 队头指针, t: 队尾指针, 初始队列为空for (int i = 1; i <= n; i++) {// 维护队列单调递增// 当队列非空且队尾对应的值 >= 当前值时,弹出队尾while (h <= t && a[q[t]] >= a[i]) t--;// 将当前下标加入队尾q[++t] = i;// 如果队头元素已经不在当前窗口内,弹出队头if (q[h] < i - k + 1) h++;// 当窗口形成时(i >= k),输出当前窗口的最小值if (i >= k) cout << a[q[h]] << " ";}cout << endl;// 第二部分:维护窗口最大值h = 1, t = 0;  // 重置队列for (int i = 1; i <= n; i++) {// 维护队列单调递减// 当队列非空且队尾对应的值 <= 当前值时,弹出队尾while (h <= t && a[q[t]] <= a[i]) t--;// 将当前下标加入队尾q[++t] = i;// 如果队头元素已经不在当前窗口内,弹出队头if (q[h] < i - k + 1) h++;// 当窗口形成时(i >= k),输出当前窗口的最大值if (i >= k) cout << a[q[h]] << " ";}cout << endl;return 0;
}
// 使用acwing模板二刷
#include <bits/stdc++.h>
using namespace std;
const int N = 1000005;
int n, k, a[N], q[N];  // a: 输入数组, q: 单调队列(存储下标)
int main()
{cin >> n >> k;  // 读入数组长度和窗口大小// 读入数组元素for (int i = 1; i <= n; i++) cin >> a[i];// 第一部分:求滑动窗口最小值int hh = 0, tt = -1;  // 队列初始化: hh-队头, tt-队尾, 空队列时hh>ttfor (int i = 1; i <= n; i++){// 1. 维护窗口范围: 如果队头元素不在窗口内,弹出队头if (hh <= tt && q[hh] < i - k + 1) hh++;// 2. 维护队列单调性: 保持队列单调递增while (hh <= tt && a[q[tt]] >= a[i]) tt--;// 3. 当前下标入队q[++tt] = i;// 4. 当窗口形成时,输出当前窗口最小值(队头元素)if (i >= k) cout << a[q[hh]] << " "; }cout << endl;// 第二部分:求滑动窗口最大值hh = 0, tt = -1;  // 重置队列for (int i = 1; i <= n; i++){// 1. 维护窗口范围if (hh <= tt && q[hh] < i - k + 1) hh++;// 2. 维护队列单调性: 保持队列单调递减(求最大值)while (hh <= tt && a[q[tt]] <= a[i]) tt--;// 3. 当前下标入队q[++tt] = i;// 4. 当窗口形成时,输出当前窗口最大值(队头元素)if (i >= k) cout << a[q[hh]] << " ";}cout << endl;return 0;
}

【运行结果】

8 3
1 3 -1 -3 5 3 6 7
-1 -3 -3 -3 3 3
3 3 5 5 6 7
http://www.jsqmd.com/news/394206/

相关文章:

  • 代码诊疗室:谁动了我的 CPU?深度破解那些“玄学”Bug
  • 奥数-组合数学 - ace-
  • 从零开始学Flink:实时数仓与维表时态Join实战
  • 奥数-几何 - ace-
  • 基于小波神经网络WNN的短时负荷预测附Matlab代码
  • P2757 等差子序列 Sol
  • 晶抗生物2026年市场评测:用户选择背后的产品逻辑,小鼠的elisa试剂盒/酶联免疫试剂盒,晶抗生物公司推荐排行 - 品牌推荐师
  • 题解:洛谷 P7910 [CSP-J 2021] 插入排序
  • 基于完整集成经验模态分解(CEEMDAN)和近似熵(ApEn)CEENDAN-ApEn信号去噪附Matlab代码
  • 微信小程序Python知茶叶知识科普商城考试错题
  • 基于线性判别分析和三比值法的变压器故障识别附Matlab代码
  • 三菱FX5U+MCGS(昆仑通态)程序 1、完整的上下料接驳台项目分享; 2、三菱FX5U全S...
  • 揭秘V8引擎的类型混淆漏洞:安全开发的警示与启示
  • 电网“搭线“指南:用VSG预同步玩转三电平逆变器
  • 奥数-数论 - ace-
  • 告别 DNS 污染与封锁:手把手教你免费搭建独享 Cloudflare DoH 服务器,全球都可访问!
  • 题解:洛谷 P2671 [NOIP 2015 普及组] 求和
  • YOLO26涨点改进 | 全网独家创新,注意力改进篇| SCI一区Top | 引入AFCA自适应细粒度通道注意力,联合建模全局与局部通道依赖关系,适合目标检测、图像去雾、关键点检测、图像分类、图像分割
  • 【一文读懂】RAG的重要组成-向量数据库
  • 告别 DNS 污染与封锁:手把手教你免费搭建独享 Cloudflare DoH 服务器,全球都可访问!使用Cloudflare Zero Trust功能。
  • 实测对比后!千笔,口碑爆棚的降AIGC工具
  • RAG系统优化指南:Chunk分块策略详解,从入门到精通,收藏这一篇就够了!!
  • 题解:洛谷 P7072 [CSP-J 2020] 直播获奖
  • 2026最新!千笔ai写作,MBA论文写作利器
  • 奥数-代数 - ace-
  • 【STFT-CNN-BiGRU的故障诊断】基于短时傅里叶变换(STFT)结合卷积神经网络(CNN)与双向门控循环单元BiGRU的故障诊断研究附Matlab代码
  • 2026年35岁程序员的5条出路:AI赛道疯狂抢人,年薪百万不是梦
  • 【无人机部署】基于k - means、网格、随机算法改变UAV的数量来观察不同放置策略对总链路比特率的影响附matlab代码
  • 【图像加密】基于维纳滤波器和运动模糊的点扩散函数的图像加密算法研究附matlab代码
  • 【AI大模型】带你解析9种提速又提效的Transformer优化方案!