news 2026/5/1 10:45:16

2023年信奥赛C++提高组csp-s初赛真题及答案解析(完善程序第2题)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2023年信奥赛C++提高组csp-s初赛真题及答案解析(完善程序第2题)

2023年信奥赛C++提高组csp-s初赛真题及答案解析(完善程序第2题)

#### 第2题

(最大值之和)给定整数序列a 0 , ⋯ , a n − 1 a_0,⋯,a_{n−1}a0,,an1,求该序列所有非空连续子序列的最大值之和。上述参数满足1 ≤ n ≤ 10 5 和 1 ≤ a i ≤ 10 8 1≤n≤10^5和 1≤a_i≤10^81n1051ai108

一个序列的非空连续子序列可以用两个下标 l和 r(其中0≤l≤r<n)表示,对应的序列为a l , a l + 1 , ⋯ , a r a_l,a_{l+1},⋯,a_ral,al+1,,ar。两个非空连续子序列不同,当且仅当下标不同。

例如,当原序列为[ 1 , 2 , 1 , 2 ] [1,2,1,2][1,2,1,2]时,要计算子序列 [1]、[2]、[1]、[2]、[1,2]、[2,1]、[1,2]、[1,2,1]、[2,1,2]、[1,2,1,2] 的最大值之和,答案为 18。注意 [1,1] 和 [2,2]虽然是原序列的子序列,但不是连续子序列,所以不应该被计算。另外,注意其中有一些值相同的子序列,但由于他们在原序列中的下标不同,属于不同的非空连续子序列,所以会被分别计算。

解决该问题有许多算法,以下程序使用分治算法,时间复杂度 O(nlog⁡n)。

试补全程序。

#include<iostream>#include<algorithm>#include<vector>constintMAXN=100000;intn;inta[MAXN];longlongans;voidsolve(intl,intr){if(l+1==r){ans+=a[l];return;}intmid=(l+r)>>1;std::vector<int>pre(a+mid,a+r);for(inti=1;i<r-mid;++i);std::vector<longlong>sum(r-mid+1);for(inti=0;i<r-mid;++i)sum[i+1]=sum[i]+pre[i];for(inti=mid-1,j=mid,max=0;i>=l;--i){while(j<r&&)++j;max=std::max(max,a[i]);ans+=;ans+=;}solve(l,mid);solve(mid,r);}intmain(){std::cin>>n;for(inti=0;i<n;++i)std::cin>>a[i];;std::cout<<ans<<std::endl;return0;}
  1. ①处应填()

    A.pre[i] = std::max(pre[i - 1], a[i - 1])

    B.pre[i + 1] = std::max(pre[i],pre[i + 1])

    C.pre[i] = std::max(pre[i -1], a[i])

    D.pre[i] = std::max(pre[i], pre[i - 1])

  2. ②处应填()

    A.a[j] < max

    B.a[j] < a[i]

    C.pre[j - mid] < max

    D.pre[j - mid] > max

  3. ③处应填()

    A.(long long)(j - mid) * max

    B.(long long)(j - mid) * (i - 1) * max

    C.sum[j - mid]

    D.sum[j - mid] * (i - 1)

  4. ④处应填()

    A.(long long)(r - j) * max

    B.(long long)(r - j) * (mid - i) * max

    C.sum[r - mid] - sum[j - mid]

    D.(sum[r - mid] - sum[j - mid]) * (mid - i)

  5. ⑤处应填()

    A.solve(0,n)

    B.solve(0,n - 1)

    C.solve(1,n)

    D.solve(1,n - 1)

解题思路

该程序使用分治算法计算序列所有非空连续子序列的最大值之和。分治的核心思想是将区间[ l , r ) [l, r)[l,r)分成左右两半[ l , mid ) [l, \text{mid})[l,mid)[ mid , r ) [\text{mid}, r)[mid,r),递归计算左右内部的贡献,再计算跨越中点的子序列的贡献。

跨越中点贡献的计算

  • 预处理右半部分的前缀最大值数组pre及其前缀和数组sum
  • 对于每个左端点i ii(从mid − 1 \text{mid}-1mid1向左枚举),维护左半部分的最大值max \text{max}max,并利用双指针j jj将右端点分为两部分:
    1. 右端点j ∈ [ mid , j 0 ) j \in [\text{mid}, j_0)j[mid,j0):区间最大值由左半部分贡献,即max \text{max}max
    2. 右端点j ∈ [ j 0 , r ) j \in [j_0, r)j[j0,r):区间最大值由右半部分贡献,即pre [ j − mid ] \text{pre}[j-\text{mid}]pre[jmid]
  • 指针j jj的移动条件为:a [ j ] < a [ i ] a[j] < a[i]a[j]<a[i],即找到第一个a [ j ] ≥ a [ i ] a[j] \ge a[i]a[j]a[i]的位置。
答案及解析
  1. D:预处理pre为右半部分的前缀最大值。
  2. B:移动指针j jj的条件为a [ j ] < a [ i ] a[j] < a[i]a[j]<a[i]
  3. A:第一组贡献为( j − mid ) × max (\text{j} - \text{mid}) \times \text{max}(jmid)×max
  4. C:第二组贡献为sum [ r − mid ] − sum [ j − mid ] \text{sum}[r-\text{mid}] - \text{sum}[j-\text{mid}]sum[rmid]sum[jmid]
  5. A:初始调用为solve(0, n),表示整个区间[ 0 , n ) [0, n)[0,n)

专栏推荐:信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新)
https://blog.csdn.net/weixin_66461496/category_13125089.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 点击跳转

信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新)
https://blog.csdn.net/weixin_66461496/category_13125089.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/5/1 8:38:10

【完整源码+数据集+部署教程】工图机械零件特征图像分割系统源码&数据集分享 [yolov8-seg-LAWDS&yolov8-seg-RevCol等50+全套改进创新点发刊_一键训练教程_Web前端

背景意义 随着工业自动化和智能制造的迅速发展&#xff0c;机械零件的检测与识别在生产过程中变得愈发重要。传统的人工检测方法不仅效率低下&#xff0c;而且容易受到人为因素的影响&#xff0c;导致误判和漏判。因此&#xff0c;基于计算机视觉的自动化检测技术逐渐成为研究的…

作者头像 李华
网站建设 2026/5/1 7:36:06

【完整源码+数据集+部署教程】垃圾分类分割系统源码&数据集分享 [yolov8-seg-GFPN&yolov8-seg-timm等50+全套改进创新点发刊_一键训练教程_Web前端展示]

背景意义 随着城市化进程的加快和人口的不断增长&#xff0c;垃圾产生量急剧增加&#xff0c;垃圾分类和处理问题日益凸显。垃圾的无序堆放不仅占用大量土地资源&#xff0c;还对环境造成了严重污染&#xff0c;影响了人们的生活质量。因此&#xff0c;如何有效地进行垃圾分类&…

作者头像 李华
网站建设 2026/5/1 7:34:50

超越Git:迈向数据驱动的机器学习模型版本管理

好的&#xff0c;遵照您的要求&#xff0c;基于随机种子 1770681600067 所启发的思考方向&#xff0c;我将为您撰写一篇关于“模型版本管理”的深度技术文章。本文将从数据驱动的视角切入&#xff0c;探讨超越传统代码版本控制的模型管理范式。 超越Git&#xff1a;迈向数据驱动…

作者头像 李华
网站建设 2026/5/1 8:54:16

2000-2025年县域5A级旅游景区DID

数据简介 针对区县是否有 5A 级景区可展开的研究&#xff0c;可以围绕 5A 景区与区县发展的关联维度全面铺开&#xff0c;核心涵盖景区创建可行性、发展影响及优化路径三大核心方向&#xff0c;同时兼顾区域差异与实践导向。可研究区县现有旅游资源禀赋与 5A 景区评定标准的匹…

作者头像 李华
网站建设 2026/5/1 7:21:34

串级PID控制3508(2)(单环角度环+单环角速度环+串级PID)

这篇PID的调制就知识我自己个人对于PID的理解了&#xff0c;看了B站好多大佬的视频所以有问题请大家见谅&#xff0c;也请大家多多指正。 这里给大家介绍一个学习PID现象的网页 https://pid-simulator-web.skythinker.top/ 首先我们要知道&#xff0c;DJM3508C620电调的反馈值…

作者头像 李华
网站建设 2026/4/18 23:31:24

KCD Beijing + vLLM 2026 议题征集中!

Kubernetes AI 大模型推理&#xff0c;一场社区共创的技术盛会当 Kubernetes 成为 AI 基础设施的事实标准&#xff0c;当 大模型推理进入工程化与规模化阶段&#xff0c;云原生与 AI&#xff0c;正在真正走向融合。于是&#xff0c;KCD Beijing 与 vLLM 社区 决定一起做一件事…

作者头像 李华