题目链接

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的更多相关文章

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

    题面 单调队列模板题. 单调队列可以从队首和队尾出队. 队列中的元素大小具有一定的顺序. 具体可参考这一篇题解 #include <bits/stdc++.h> #define itn i ...

  2. 【洛谷P1886】滑动窗口——单调队列

    没想到啊没想到,时隔两个月,我单调队列又懵了…… 调了一个小时,最后错在快读,啊!!!!(不过洛谷讨论真好啊,感谢大佬!) 考前就不推新东西了,好好写写那些学过的东西 题目点这里(我就不粘了自己点一下 ...

  3. [洛谷P1886]滑动窗口 (单调队列)(线段树)

    ---恢复内容开始--- 这是很好的一道题 题目描述: 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口. 现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的 ...

  4. 洛谷 P1886 滑动窗口(单调队列)

    题目链接 https://www.luogu.org/problemnew/show/P1886 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始 ...

  5. 洛谷 P1886 滑动窗口(单调队列)

    嗯... 题目链接:https://www.luogu.org/problem/P1886 首先这道题很典型,是标准的单调队列的模板题(也有人说单调队列只能解决这一个问题).这道题可以手写一个队列,也 ...

  6. 关于双端队列 deque 模板 && 滑动窗口 (自出)

    嗯... deque 即为双端队列,是c++语言中STL库中提供的一个东西,其功能比队列更强大,可以从队列的头与尾进行操作... 但是它的操作与队列十分相似,详见代码1: 1 #include < ...

  7. 洛谷P1886 滑动窗口(POJ.2823 Sliding Window)(区间最值)

    To 洛谷.1886 滑动窗口 To POJ.2823 Sliding Window 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每 ...

  8. 【洛谷P1886】滑动窗口

    滑动窗口 [题目描述] 有N个数字,以及一个大小为k的窗口.现在这个窗口从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 思路: k<=N<=1000000,暴 ...

  9. 洛谷 P1886 滑动窗口

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...

随机推荐

  1. Exynos4412 中断处理流程详解

    Linux 中,当外设触发中断后,大体处理流程如下: a -- 具体CPU architecture相关的模块会进行现场保护,然后调用machine driver对应的中断处理handler; b - ...

  2. Element - 日期禁用集合(持续更新)

    当前日期之前的日期禁用 <el-date-picker v-model="form.startTime" type="date" placeholder= ...

  3. LOTO虚拟示波器软件功能演示之——FIR数字滤波

    本文章介绍一下LOTO示波器新出的功能--FIR数字滤波的功能. 在此之前我们先来了解一下带通滤波和带阻滤波.我们都知道每个信号是不同频率不同幅值正弦波的线性叠加,为了方便直接得观察到这种现象,就有了 ...

  4. 编译静态库的方式使用spdlog和fmt

    前言 spdlog++库,而且支持header only方式,但header only的使用方式会造成编译时长增加,所以这里简单描述一下,其编译静态库的方式. 又因为spdlog还依赖另一个开源库fm ...

  5. mysql-5.7.30安装

    1.由于在线安装受制于网络环境,所以选择tar包编译安装.      首先去mysql镜像站下载mysql-5.7.30-linux-glibc2.5-x86_64.tar.gz2.上传到linux服 ...

  6. java meil

    import java.util.Date; import java.util.List; import java.util.Properties; import javax.activation.D ...

  7. IDEA Plugin,写一个看股票指数和K线的插件

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 没招了,不写点刺激的,你总是不好好看! 以前,我不懂.写的技术就是技术内容,写的场景 ...

  8. 使用.NET5、Blazor和Electron.NET构建跨平台桌面应用

    Electron.NET是一个嵌入了ASP.NET Core的Electron的封装,通过Electron.NET可以构建基于.NET5的跨平台的桌面应用,使得开发人员只需要使用ASP.NET Cor ...

  9. [atAGC049E]Increment Decrement

    由于每一个操作的逆操作都存在,可以看作将$a_{i}$全部变为0的代价 先考虑第一个问题,即对于确定的$a_{i}$如何处理 如果仅能用第2种操作,定义点$i$的代价为以$i$为左端点或以$i-1$为 ...

  10. opencv 视频处理相关

    包含视频格式知识(编解码和封装格式):如何获取视频信息及视频编解码格式:opencv读取及保存视频,及opencv fourcc编码格式 一.基础知识 视频的编解码格式和封装格式 参考如山似水 视频编 ...