C++实现简单的前缀和数组 _ O(1)复杂度查询区间和【实战】

煙雲

煙雲

2026-04-13

860人浏览

原创

前缀和数组是预处理原数组各前缀累加和的辅助数组,能o(1)查区间和,但要求原数组不可变;其核心为prefix[i] = a[0]+…+a[i−1],查询[l,r]和用prefix[r+1]−prefix[l]。

c++实现简单的前缀和数组 _ o(1)复杂度查询区间和【实战】

什么是前缀和数组?它真能 O(1) 查区间和吗

能,但前提是数组不修改。前缀和本质是用 O(n) 预处理空间换时间:对原数组 a 构造新数组 prefix,其中 prefix[i] 表示 a[0] + a[1] + ... + a[i-1](常用 1-indexed 定义),这样任意区间 [l, r] 的和就是 prefix[r+1] - prefix[l]

注意:下标偏移极易出错。常见错误包括越界访问、漏减 1、混淆 0-indexed 和 1-indexed 场景。

  • 若原数组长度为 nprefix 长度应为 n+1prefix[0] = 0
  • prefix[i] 对应前 i 个元素(即 a[0..i-1]),不是前 i+1
  • 查询 [l, r](0-indexed 闭区间)时,结果是 prefix[r+1] - prefix[l],不是 prefix[r] - prefix[l-1]

C++ 实现细节:vector 初始化与循环边界

std::vector 最稳妥。别手写 new int[n+1] —— 容易忘 delete,且不支持自动扩容。

关键在初始化和递推:

C函数速查手册(CHM版)
C函数速查手册(CHM版)

C函数速查手册(CHM版)

下载
vector<int> a = {1, 2, 3, 4, 5};
vector<int> prefix(a.size() + 1, 0); // 显式初始化 size+1 个 0
for (int i = 1; i <ul>
<li>循环变量 <code>i</code> 从 <code>1</code> 开始,到 <code>a.size()</code> 结束(含),对应 <code>prefix[1..n]</code>
</li>
<li>
<code>prefix[0]</code> 必须为 <code>0</code>,否则 <code>[0, r]</code> 查询会错</li>
<li>如果后续要频繁查,建议把构造逻辑封装成函数,避免重复写边界</li>
</ul>
<h3>遇到负数、大数怎么办?溢出风险在哪</h3>
<p>前缀和本身不关心正负,但累加过程可能溢出。C++ 中 <code>int</code> 通常为 32 位,最大约 2e9。若原数组元素绝对值大或长度超 1e5,<code>int</code> 很容易溢出。</p>
<ul>
<li>保守做法:统一用 <code>long long</code> 存 <code>prefix</code>,即使 <code>a</code> 是 <code>int</code>
</li>
<li>不要假设“数据小就没事”—— 竞赛题或线上日志统计常暗藏大值</li>
<li>若必须用 <code>int</code>,需提前检查:每步加法前判断 <code>prefix[i-1] > INT_MAX - a[i-1]</code>,但会拖慢速度,一般不推荐</li>
</ul>
<h3>为什么不能边改边查?替代方案有哪些</h3>
<p>原始前缀和不支持单点修改。一旦改了 <code>a[i]</code>,从 <code>i+1</code> 开始所有 <code>prefix[j]</code> 都得重算,退化为 <code>O(n)</code>。</p>
<p>真需要动态更新,就该换结构:</p>
<ul>
<li>单点改 + 区间查 → 用 <code>std::vector</code> 配合 <code>std::partial_sum</code> 重算整个前缀和(适合修改极少)</li>
<li>频繁修改 + 查询 → 改用树状数组(<code>BIT</code>)或线段树,两者都支持 <code>O(log n)</code> 修改与查询</li>
<li>只查不改、内存极敏感 → 可考虑原地构造(复用 <code>a</code> 数组),但牺牲可读性,不推荐初学使用</li>
</ul>
<p>前缀和的简洁性建立在「静态」前提上;一旦这个前提松动,就得立刻评估是否还值得用它。</p></int></int>

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

2958

3

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.29

1709

6

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

2025.08.29

1675

10

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.29

745

10

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

2023.11.13

1290

4

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.12.29

460

3

maven常用插件使用大全
maven常用插件使用大全

PHP中文网精心整理Maven主流插件用法合集,涵盖编译、测试、打包等常用插件使用大全。从基础配置到进阶实战,详细解析各插件功能与适用场景,助你轻松掌握Maven自动化构建,解决Java项目开发痛点,是开发者必备的实用指南。

2026.08.05

0

31

PyCharm快速入门指南
PyCharm快速入门指南

本专题汇总了PyCharm快速入门的全套指南与教程,涵盖从官网下载安装、创建第一个Python项目、配置虚拟环境,到代码编辑、运行调试等基础操作,并整理了版本控制(Git)集成、常用高效快捷键及实用插件等进阶技巧,助你快速上手这款高效的Python IDE。

2026.08.05

1

17

PyCharm运行程序教程大全
PyCharm运行程序教程大全

本专题汇总了PyCharm运行程序的多种方式与详细操作步骤,涵盖通过主菜单Run、点击工具栏绿色三角图标、使用快捷键Shift+F10(或Ctrl+Shift+F10)等基本运行方法,以及配置运行/调试参数、设置PYTHONPATH环境变量、管理多脚本运行与交互式Python控制台调试等进阶技巧,助您全面掌握在PyCharm中高效运行与管理Python程序的方法。

2026.08.05

0

14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RabbitMQ 教程手册
RabbitMQ 教程手册

共0课时 | 0人学习

Linux man-pages 项目
Linux man-pages 项目

共0课时 | 0人学习

C# 教程
C# 教程

共94课时 | 20.2万人学习