洛谷 P1886 滑动窗口(单调队列)
原题
本题是一道很经典的单调队列模板题,如果想要O(1)的时间内回答每个窗口,用ST表也可以,但是这道题洛谷上会被卡MLE,所以就来介绍一下单调队列。
因为是初次尝试,也为了便于理解,所以用数组模拟了单调队列
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,k,a[1000005],p[1000005];
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int head=1,tail=0;//定义单调队列的头指针和尾指针,储存的是数组下标。
for(int i=1;i<=n;i++)//我们先求最小值,头指针储存最小值下标
{
if(head<=tail&&p[head]<i-k+1)//首先我们要先判断队列内的元素在不在滑动窗口内,如果不在,则头指针++
head++;
while(head<=tail&&a[p[tail]]>a[i])//如果比队尾元素小的话,就继续往下寻找(tail++),直到找不到
tail--;
p[++tail]=i;//加入队尾
if(i>=k)//保证滑动窗口合法
printf("%d ",a[p[head]]);
}
puts("");
head=1,tail=0;
for(int i=1;i<=n;i++)
{
while(head<=tail&&p[head]<i-k+1)
head++;
while(head<=tail&&a[p[tail]]<a[i])//找最大值同理,只要改变下进入队列的比较符号即可
tail--;
p[++tail]=i;
if(i>=k)
printf("%d ",a[p[head]]);
}
return 0;
}
戒骄戒躁,百炼成钢!
分类:
数据结构-单调队列单调栈
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· DeepSeek+PageAssist实现本地大模型联网
· 手把手教你更优雅的享受 DeepSeek
· Java轻量级代码工程
· 从 14 秒到 1 秒:MySQL DDL 性能优化实战