【模板】滑动窗口最值(单调队列)/洛谷P1886
题目链接
https://www.luogu.com.cn/problem/P1886
题目大意
有一个长为 \(n\) 的序列 \(a\) ,以及一个大小为 \(k\) 的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。
题目解析
使用 \(C++\) 的 \(STL\) 库中的 \(deque\) 。
以窗口最小值为例,设该双端队列为 \(Q\) ,其队头则为每一次的答案:
首先,保证 \(Q\) 中均为未过期的值(即, \(Q\) 中元素均在窗口中)。
然后,比较 \(Q\) 的队头与新加入的值 \(a[i]\) 。
- 若 \(a[i]\) 更小,则可以清空队列,加入 \(a[i]\) (因为此时 \(a[i]\) 不但最新,而且最小)。
- 若原队头更小,将 \(a[i]\) 加入队尾,但是在加入之前,确保 \(a[i]\) 大于队尾(如果 \(a[i] \leq\) 队尾,则明显更优,队尾就废弃直接弹出了)。
这样,就可以保证答案的正确性了。
其次,我们来考虑复杂度,队列中长度总不大于窗口大小,每一个元素只进出一次, \(a[i]\) 总比较次数不超过 \(n\) 次,因此总的时间复杂度为 \(O(n)\) 。
最大值同理。
参考代码
#include <bits/stdc++.h>
using namespace std;
deque <pair <int, int> > Q;
vector <int> a;
int main()
{
int n, k, x;
scanf("%d%d", &n, &k);
for (int i = 0; i < n; ++i) {
scanf("%d", &x);
a.push_back(x);
}
/*求滑动窗口最小值*/
for (int i = 0; i < n; ++i) {
if (!Q.empty()) {
if (a[i] <= Q.front().first) {Q.clear(); Q.emplace_front(a[i], i);}
else {
while (a[i] <= Q.back().first) Q.pop_back();
Q.emplace_back(a[i], i);
}
}
else Q.emplace_back(a[i], i);
if (i >= k-1) {
while (!Q.empty() && Q.front().second < i-k+1) Q.pop_front();
if (!Q.empty()) printf("%d ", Q.front().first);
}
}
putchar('\n');
Q.clear();
/*求滑动窗口最大值*/
for (int i = 0; i < n; ++i) {
if (!Q.empty()) {
if (a[i] >= Q.front().first) {Q.clear(); Q.emplace_front(a[i], i);}
else {
while (a[i] >= Q.back().first) Q.pop_back();
Q.emplace_back(a[i], i);
}
}
else Q.emplace_back(a[i], i);
if (i >= k-1) {
while (!Q.empty() && Q.front().second < i-k+1) Q.pop_front();
if (!Q.empty()) printf("%d ", Q.front().first);
}
}
putchar('\n');
return 0;
}
感谢支持!
【模板】滑动窗口最值(单调队列)/洛谷P1886的更多相关文章
- 题解【洛谷P1886】滑动窗口 /【模板】单调队列
题面 单调队列模板题. 单调队列可以从队首和队尾出队. 队列中的元素大小具有一定的顺序. 具体可参考这一篇题解 #include <bits/stdc++.h> #define itn i ...
- 【洛谷P1886】滑动窗口——单调队列
没想到啊没想到,时隔两个月,我单调队列又懵了…… 调了一个小时,最后错在快读,啊!!!!(不过洛谷讨论真好啊,感谢大佬!) 考前就不推新东西了,好好写写那些学过的东西 题目点这里(我就不粘了自己点一下 ...
- [洛谷P1886]滑动窗口 (单调队列)(线段树)
---恢复内容开始--- 这是很好的一道题 题目描述: 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口. 现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的 ...
- 洛谷 P1886 滑动窗口(单调队列)
题目链接 https://www.luogu.org/problemnew/show/P1886 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始 ...
- 洛谷 P1886 滑动窗口(单调队列)
嗯... 题目链接:https://www.luogu.org/problem/P1886 首先这道题很典型,是标准的单调队列的模板题(也有人说单调队列只能解决这一个问题).这道题可以手写一个队列,也 ...
- 关于双端队列 deque 模板 && 滑动窗口 (自出)
嗯... deque 即为双端队列,是c++语言中STL库中提供的一个东西,其功能比队列更强大,可以从队列的头与尾进行操作... 但是它的操作与队列十分相似,详见代码1: 1 #include < ...
- 洛谷P1886 滑动窗口(POJ.2823 Sliding Window)(区间最值)
To 洛谷.1886 滑动窗口 To POJ.2823 Sliding Window 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每 ...
- 【洛谷P1886】滑动窗口
滑动窗口 [题目描述] 有N个数字,以及一个大小为k的窗口.现在这个窗口从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 思路: k<=N<=1000000,暴 ...
- 洛谷 P1886 滑动窗口
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...
随机推荐
- 【代码更新】单细胞分析实录(20): 将多个样本的CNV定位到染色体臂,并画热图
之前写过三篇和CNV相关的帖子,如果你做肿瘤单细胞转录组,大概率看过: 单细胞分析实录(11): inferCNV的基本用法 单细胞分析实录(12): 如何推断肿瘤细胞 单细胞分析实录(13): in ...
- Luogu P4390 [BOI2007]Mokia 摩基亚 | CDQ分治
题目链接 $CDQ$分治. 考虑此时在区间$[l,r]$中,要计算$[l,mid]$中的操作对$[mid+1,r]$中的询问的影响. 计算时,排序加上树状数组即可. 然后再递归处理$[l,mid]$和 ...
- hdu 5183 Negative and Positive (NP)(STL-集合【HASH】)
题意: When given an array (a0,a1,a2,⋯an−1) and an integer K, you are expected to judge whether there i ...
- linux 内核源代码情景分析——Intel X86 CPU 系列的寻址方式
当我们说一个CPU是"16位"或"32"位时,指的是处理器中"算数逻辑单元"(ALU)的宽度.数据总线通常与ALU具有相同的宽度.当Inte ...
- 【JavaScript】JS的坚实基础
前言 考虑到在后面的开发中,需要大量的使用js语言去进行开发,所以准备重新规整一下javascript的知识点,专门开了一个js的专栏,用来复习一下js语言.万事开头难,要是后面写的有问题的,欢迎 ...
- VSCode 微信小程序 开发环境配置 详细教程
本博客已暂停更新,需要请转新博客http://www.whbwiki.com/231.html 配置 VsCode 微信小程序开发环境并非不用官方的 微信小程序开发者工具 ,而是两者配合适用,可以极大 ...
- 【AI测试】人工智能 (AI) 测试--第二篇
测试用例 人工智能 (AI) 测试 或者说是 算法测试,主要做的有三件事. 收集测试数据 思考需要什么样的测试数据,测试数据的标注 跑测试数据 编写测试脚本批量运行 查看数据结果 统计正确和错误的个数 ...
- 03 | 变量的解构赋值 | es6
变量的解构赋值 数组的解构赋值 基本用法 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前,为变量赋值,只能直接指定值. let a ...
- VIM处理工具与正则表达式
*本文中/data目录为训练目录 1.在vim中设置TAB缩进为四个字符 打开vim 输入:set tabstop=4 2.复制/etc/rc.d/init.d/functions文件至/tmp/,替 ...
- python unicode escape
from: https://stackoverflow.com/questions/44742806/how-to-remove-escape-characters-escaping-unicode- ...