news 2026/3/16 20:58:48

信奥赛C++提高组csp-s之单调队列详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
信奥赛C++提高组csp-s之单调队列详解

信奥赛C++提高组csp-s之单调队列详解

一、基本概念

单调队列是一种特殊的队列数据结构,其内部元素始终保持单调递增或单调递减的特性。核心用途是高效解决滑动窗口类问题,例如在 O(n) 时间复杂度内找到所有窗口的最大/最小值。

二、核心特性
  1. 单调性:队列内元素保持严格单调递增或递减。
  2. 时效性:及时移除超出窗口范围的元素。
  3. 高效维护:每个元素入队一次、出队一次,时间复杂度 O(n)。
三、应用场景
  • 滑动窗口最大值/最小值
  • 限制区间最值问题
  • 优化动态规划中的状态转移

研究案例: 滑动窗口 /【模板】单调队列

题目描述

给定一个长度为n的数组和一个固定大小的窗口k,窗口从数组最左端滑动到最右端。要求输出每个窗口中的最小值和最大值。

输入示例

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

输出示例

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

解题思路
  1. 维护一个单调递减队列,队头始终是当前窗口最大值
  2. 遍历数组时:
    • 移除队头过期元素(超出窗口范围)
    • 从队尾移除比当前元素小的元素
    • 将当前元素索引加入队列
    • 记录窗口最大值/最小值

代码实现(数组模拟单调队列)

#include<cstdio>usingnamespacestd;constintMAXN=1e6+10;inta[MAXN],q[MAXN];// 数组和单调队列(存储下标)intn,k;voidgetMin(){inthead=1,tail=0;// 队列头尾指针for(inti=1;i<=n;i++){// 删除超出窗口的队头元素while(head<=tail&&q[head]<i-k+1)head++;// 维护单调递增性(队尾比当前元素大则删除)while(head<=tail&&a[i]<=a[q[tail]])tail--;q[++tail]=i;// 当前元素下标入队// 从第k个元素开始输出if(i>=k)printf("%d ",a[q[head]]);}printf("\n");}voidgetMax(){inthead=1,tail=0;// 队列头尾指针for(inti=1;i<=n;i++){// 删除超出窗口的队头元素while(head<=tail&&q[head]<i-k+1)head++;// 维护单调递减性(队尾比当前元素小则删除)while(head<=tail&&a[i]>=a[q[tail]])tail--;q[++tail]=i;// 当前元素下标入队// 从第k个元素开始输出if(i>=k)printf("%d ",a[q[head]]);}printf("\n");}intmain(){scanf("%d %d",&n,&k);for(inti=1;i<=n;i++)scanf("%d",&a[i]);getMin();// 输出所有窗口的最小值getMax();// 输出所有窗口的最大值return0;}

关键代码解析

  1. 队列初始化

    inthead=1,tail=0;

    使用数组模拟队列,headtail分别表示队列头和尾的指针。

  2. 移除过期元素

    while(head<=tail&&q[head]<i-k+1){head++;}

    当队头元素索引超出当前窗口左边界时(计算方式:i - k + 1),将其移出队列。

  3. 维护单调性

    while(head<=tail&&a[i]>=a[q[tail]]){tail--;}

    从队尾向前删除所有小于等于当前元素的索引,保证队列单调递减。

  4. 记录结果

    if(i>=k-1){cout<<a[q[head]]<<" ";}

    当遍历到第 k 个元素时开始输出,此时队列头即为当前窗口最大值。

重点强调

  1. 双队列策略

    • getMin():维护单调递增队列,队头始终是窗口最小值
    • getMax():维护单调递减队列,队头始终是窗口最大值
  2. 队列维护核心操作

    while(head<=tail&&q[head]<i-k+1)head++;// 清除过期元素while(head<=tail&&a[i]<=a[q[tail]])tail--;// 维护单调性q[++tail]=i;// 入队新元素
  3. 时间复杂度

    • 每个元素入队、出队各一次,总时间复杂度O(n)
    • 空间复杂度O(n)

关键点总结

  • 单调队列本质:通过及时淘汰无用数据,将求极值的复杂度从 O(nk) 优化到 O(n)
  • 窗口边界判断i - k是窗口左边界的前一个位置
  • 队列存储索引:既能判断元素位置是否过期,又能直接访问原数组值

更多系列知识,请查看专栏:《信奥赛C++提高组csp-s知识详解及案例实践》:
https://blog.csdn.net/weixin_66461496/category_13113932.html


各种学习资料,助力大家一站式学习和提升!!!

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"########## 一站式掌握信奥赛知识! ##########";cout<<"############# 冲刺信奥赛拿奖! #############";cout<<"###### 课程购买后永久学习,不受限制! ######";return0;}

1、csp信奥赛高频考点知识详解及案例实践:

CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转

CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转

信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html

2、csp信奥赛冲刺一等奖有效刷题题解:

CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

CSP信奥赛C++一等奖通关刷题题单及题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转

3、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转


GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html

4、CSP信奥赛C++竞赛拿奖视频课:

https://edu.csdn.net/course/detail/40437 点击跳转

· 文末祝福 ·

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/14 2:14:43

SGLang-v0.5.6开箱即用镜像:免环境配置,10分钟体验新模型

SGLang-v0.5.6开箱即用镜像&#xff1a;免环境配置&#xff0c;10分钟体验新模型 引言&#xff1a;为什么你需要这个镜像&#xff1f; 最近AI圈热议的SGLang-v0.5.6确实带来了令人兴奋的改进——官方数据显示推理速度提升高达50%。但很多朋友可能和我一样遇到过这样的困境&am…

作者头像 李华
网站建设 2026/3/16 19:23:25

AI一键搞定JDK下载安装:快马平台智能配置指南

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个能够自动检测用户操作系统类型和架构&#xff0c;并为其推荐合适JDK版本的智能助手。功能包括&#xff1a;1.自动识别Windows/macOS/Linux系统 2.根据系统位数推荐JDK8/11…

作者头像 李华
网站建设 2026/3/15 1:37:59

没机器学习经验?照样玩转姿态估计的3个云端方案

没机器学习经验&#xff1f;照样玩转姿态估计的3个云端方案 1. 为什么选择云端姿态估计方案&#xff1f; 作为一名新媒体运营人员&#xff0c;当你需要分析舞蹈视频时&#xff0c;传统方法可能需要手动逐帧标注舞者关节位置&#xff0c;这既耗时又容易出错。而现代AI姿态估计…

作者头像 李华
网站建设 2026/3/13 11:18:25

书匠策AI:课程论文的“智能建筑师”,从零到一搭建学术思维

论文写作是学术训练的“必修课”&#xff0c;但许多学生常陷入“选题迷茫、结构松散、逻辑混乱”的困境。传统工具往往只能提供碎片化帮助&#xff0c;而书匠策AI&#xff08;官网&#xff1a;www.shujiangce.com&#xff0c;微信公众号搜一搜“书匠策AI”&#xff09;却以“系…

作者头像 李华
网站建设 2026/3/14 6:08:41

摄影爱好者必备:AI印象派工坊实战,4种艺术效果全解析

摄影爱好者必备&#xff1a;AI印象派工坊实战&#xff0c;4种艺术效果全解析 关键词&#xff1a;AI图像处理、OpenCV、非真实感渲染、艺术风格迁移、计算摄影学 摘要&#xff1a;在数字摄影日益普及的今天&#xff0c;如何将普通照片转化为具有艺术气息的画作成为摄影爱好者的关…

作者头像 李华
网站建设 2026/3/14 7:05:42

告别手动配置:EXE4J自动化打包方案对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个自动化工具&#xff0c;对比手动配置EXE4J和自动化脚本的效率。工具应能自动生成EXE4J配置文件&#xff0c;批量处理多个Java应用打包&#xff0c;记录并比较两种方式所需…

作者头像 李华