news 2026/4/21 17:37:35

csp信奥赛C++标准模板库STL案例应用17

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
csp信奥赛C++标准模板库STL案例应用17

csp信奥赛C++标准模板库STL案例应用17

deque实践

题目描述

一个含有n nn项的数列,求出每一项前的m mm个数到它这个区间内的最小值。若前面的数不足m mm项则从第1 11个数开始,若前面没有数则输出0 00

输入格式

第一行两个整数,分别表示n nnm mm

第二行,n nn个正整数,为所给定的数列a i a_iai

输出格式

n nn行,每行一个整数,第i ii个数为序列中a i a_iai之前m mm个数的最小值。

输入输出样例 1
输入 1
6 2 7 8 1 4 3 2
输出 1
0 7 7 1 1 3
说明/提示

对于100 % 100\%100%的数据,保证1 ≤ m ≤ n ≤ 2 × 10 6 1\le m\le n\le2\times10^61mn2×1061 ≤ a i ≤ 3 × 10 7 1\le a_i\le3\times10^71ai3×107

思路分析

本题要求对每个位置i,找到区间[i-m, i-1]的最小值(如果区间不足m个元素,则从第一个元素开始)。这是一个典型的滑动窗口最小值问题。

核心算法:单调队列

使用一个双端队列维护一个递增的单调队列:

  1. 队列中存储数组元素的索引,这些索引对应的值保持单调递增
  2. 对于每个新元素,从队尾移除比它大的元素(保证队列单调性)
  3. 从队首移除超出窗口范围的元素
  4. 队首元素就是当前窗口的最小值
算法复杂度
  • 时间复杂度:O(n),每个元素最多入队和出队一次
  • 空间复杂度:O(m),队列中最多存储m个索引

代码实现

#include<bits/stdc++.h>usingnamespacestd;intmain(){intn,m;cin>>n>>m;// 读取n和mvector<int>a(n+1);// 1-indexed数组,方便处理// 读取数组for(inti=1;i<=n;i++){cin>>a[i];}deque<int>dq;// 存储索引的单调队列(双端队列)// 第一个元素前面没有元素,输出0cout<<0<<'\n';// 处理从第1个到第n-1个元素(为后续元素提供窗口最小值)for(inti=1;i<n;i++){// 维护队列单调性:从队尾移除比当前元素大的元素// 因为当前元素比它们小且位置更靠后,所以这些元素不可能成为未来窗口的最小值while(!dq.empty()&&a[dq.back()]>=a[i]){dq.pop_back();}// 将当前元素索引加入队列dq.push_back(i);// 移除超出窗口范围的元素// 窗口范围是 [i-m+1, i](对于下一轮i+1来说,需要的是[i-m+2, i+1])// 但我们要为第i+1个元素找前m个元素的最小值,所以这里检查是否超出[i-m+1, i]while(!dq.empty()&&dq.front()<=i-m){dq.pop_front();}// 输出当前窗口的最小值(即为第i+1个元素前m个元素的最小值)// 如果队列为空,说明前面没有元素,输出0if(dq.empty()){cout<<0<<'\n';}else{cout<<a[dq.front()]<<'\n';}}return0;}

功能分析

输入处理
  • 第一行:读取n(数列长度)和m(窗口大小)
  • 第二行:读取n个正整数到数组a[1…n](使用1-indexed方便理解)
特殊处理
  • 对于第一个元素(i=1):前面没有元素,直接输出0
滑动窗口处理
  • 队列初始化:开始时队列为空
  • 单调性维护
    • 当新元素加入时,从队尾移除所有值大于等于它的元素
    • 这样保证队列中的元素值严格递增
  • 窗口范围维护
    • 移除队首超出当前窗口范围的元素(索引小于等于i-m)
  • 输出结果
    • 队首元素即为当前窗口的最小值
    • 如果队列为空,输出0

示例演示(输入样例)

输入:

6 2 7 8 1 4 3 2

处理过程:

i=1: 输出0(第一个元素前无元素) i=1: 处理元素a[1]=7,队列为空→队列变为[1],为a[2]准备窗口 窗口[1],最小值a[1]=7,输出7 i=2: 处理元素a[2]=8,队尾a[1]=7<8→队列变为[1,2] 窗口[1,2],最小值a[1]=7,输出7 i=3: 处理元素a[3]=1,队尾a[2]=8>=1→弹出2,队尾a[1]=7>=1→弹出1 队列变为[3] 窗口[2,3],最小值a[3]=1,输出1 i=4: 处理元素a[4]=4,队尾a[3]=1<4→队列变为[3,4] 窗口[3,4],最小值a[3]=1,输出1 i=5: 处理元素a[5]=3,队尾a[4]=4>=3→弹出4,队尾a[3]=1<3→队列变为[3,5] 窗口[4,5],最小值a[3]=1,但索引3超出窗口[4,5](3<=5-2=3)→弹出3 队列变为[5],最小值a[5]=3,输出3

输出:

0 7 7 1 1 3

注意事项

  1. 使用deque而不是普通队列,因为需要从两端操作
  2. 队列中存储索引而不是值,方便判断是否超出窗口范围
  3. 注意边界条件:当i=1时直接输出0,后续处理从i=1开始
  4. 时间复杂度必须为O(n),不能使用O(nm)的暴力解法

完整系列资料,请查看专栏:《csp信奥赛C++标准模板库STL》
https://blog.csdn.net/weixin_66461496/category_13108077.html

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

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"########## 一站式掌握信奥赛知识! ##########";cout<<"############# 冲刺信奥赛拿奖! #############";cout<<"###### 课程购买后永久学习,不受限制! ######";return0;}
  • 一、CSP信奥赛C++通关学习视频课:
    • C++语法基础
    • C++语法进阶
    • C++算法
    • C++数据结构
    • CSP信奥赛数学
    • CSP信奥赛STL
  • 二、CSP信奥赛C++竞赛拿奖视频课:
    • 信奥赛csp-j初赛高频考点解析
    • CSP信奥赛C++复赛集训课(12大高频考点专题集训)
  • 三、考级、竞赛刷题题单及题解:
    • GESP C++考级真题题解
    • CSP信奥赛C++初赛及复赛高频考点真题解析
    • CSP信奥赛C++一等奖通关刷题题单及题解

详细内容:

1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):

https://edu.csdn.net/lecturer/7901 点击跳转


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

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

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

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

  • 2025 csp-j 复赛真题及答案解析(最新更新)
  • 2025 csp-x(山东) 复赛真题及答案解析(最新更新)
  • 2025 csp-x(河南) 复赛真题及答案解析(最新更新)
  • 2025 csp-x(辽宁) 复赛真题及答案解析(最新更新)
  • 2025 csp-x(江西) 复赛真题及答案解析(最新更新)
  • 2025 csp-x(广西) 复赛真题及答案解析(最新更新)
  • 2020 ~ 2024 csp 复赛真题题单及题解
  • 2019 ~ 2022 csp-j 初赛高频考点真题分类解析
  • 2021 ~ 2024 csp-s 初赛高频考点解析
  • 2023 ~ 2024 csp-x (山东)初赛真题及答案解析
  • 2024 csp-j 初赛真题及答案解析
  • 2025 csp-j 初赛真题及答案解析(最新更新)
  • 2025 csp-s 初赛真题及答案解析(最新更新)
  • 2025 csp-x (山东)初赛真题及答案解析(最新更新)
  • 2025 csp-x (江西)初赛真题及答案解析(最新更新)
  • 2025 csp-x (辽宁)初赛真题及答案解析(最新更新)

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

  • 129 道刷题练习和详细题解,涉及:模拟算法、数学思维、二分算法、 前缀和、差分、深搜、广搜、DP专题、 树和图

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

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

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

· 文末祝福 ·

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

ImageGlass深度体验:重新定义你的图片浏览方式

ImageGlass深度体验&#xff1a;重新定义你的图片浏览方式 【免费下载链接】ImageGlass &#x1f3de; A lightweight, versatile image viewer 项目地址: https://gitcode.com/gh_mirrors/im/ImageGlass 还在为Windows自带图片查看器功能单一、启动缓慢而烦恼&#xff…

作者头像 李华
网站建设 2026/4/21 3:20:08

Cellpose-SAM终极入门指南:轻松掌握细胞分割技术

Cellpose-SAM终极入门指南&#xff1a;轻松掌握细胞分割技术 【免费下载链接】cellpose 项目地址: https://gitcode.com/gh_mirrors/ce/cellpose 在生物医学研究中&#xff0c;细胞分割是图像分析的基础环节。无论你是研究生、科研助理还是医学图像分析新手&#xff0c…

作者头像 李华
网站建设 2026/4/19 18:46:20

电力价格预测终极教程:epftoolbox完整应用方案

电力价格预测终极教程&#xff1a;epftoolbox完整应用方案 【免费下载链接】epftoolbox An open-access benchmark and toolbox for electricity price forecasting 项目地址: https://gitcode.com/gh_mirrors/ep/epftoolbox 电力价格预测是能源交易和电力市场分析的核心…

作者头像 李华
网站建设 2026/4/18 6:35:36

Kinovea终极指南:如何快速掌握专业运动分析技巧

Kinovea是一款功能强大的开源运动分析软件&#xff0c;专为体育教练、康复治疗师和运动爱好者设计。它能够通过视频捕捉、逐帧分析、动作对比和精确测量&#xff0c;帮助用户深入理解运动技术细节&#xff0c;为训练和评估提供数据支持。无论你是想要优化运动员的表现&#xff…

作者头像 李华
网站建设 2026/4/19 3:35:48

国家中小学智慧教育平台电子课本下载工具:3分钟快速上手全攻略

国家中小学智慧教育平台电子课本下载工具&#xff1a;3分钟快速上手全攻略 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具 项目地址: https://gitcode.com/GitHub_Trending/tc/tchMaterial-parser 还在为寻找优质教育资源而烦恼吗&#…

作者头像 李华
网站建设 2026/4/17 17:02:23

终极VisualCppRedist AIO指南:告别Windows程序启动失败

终极VisualCppRedist AIO指南&#xff1a;告别Windows程序启动失败 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况&#xff1a;下载…

作者头像 李华