当前位置: 首页 > news >正文

cpp中的前缀和 后缀和

前缀和、后缀和是数组预处理技巧,作用是用O(n)预处理,实现O(1)快速查询区间和
一、一维前缀和

include

using namespace std;

int main() {
vector arr = {1, 2, 3, 4}; // 原数组
int n = arr.size();

// 1. 定义前缀和数组(必须用long long,防止溢出)
vector<long long> preSum(n + 1, 0); // 2. 预处理:O(n)时间
for (int i = 1; i <= n; ++i) {preSum[i] = preSum[i - 1] + arr[i - 1];
}// 3. O(1)查询:原数组 闭区间[l, r] 的和(0<=l<=r<n)
int l = 1, r = 2;
long long sum = preSum[r + 1] - preSum[l]; // 结果:2+3=5
return 0;

}
原数组 [l, r] 区间和 = preSum[r+1] - preSum[l]
典型应用场景

  1. 多次查询任意子数组的和
  2. 统计「和为k的子数组数量」
  3. 寻找「左右两边和相等的数组分割点」
  4. 辅助解决最大子数组和、子数组平均值问题

二、一维后缀和

include

using namespace std;

int main() {
vector arr = {1, 2, 3, 4};
int n = arr.size();

// 1. 定义后缀和数组(long long防溢出)
vector<long long> sufSum(n + 1, 0); // 2. 预处理:倒序遍历,O(n)时间
for (int i = n - 1; i >= 0; --i) {sufSum[i] = sufSum[i + 1] + arr[i];
}// 3. O(1)查询:原数组 [i, n-1] 后缀区间和
int i = 1;
long long sum = sufSum[i]; // 结果:2+3+4=9
return 0;

}
原数组 [i, 末尾] 区间和 = sufSum[i]
典型应用场景

  1. 快速求数组右侧所有元素的和
  2. 结合前缀和,判断「数组平衡点」(左边和=右边和)
  3. 倒序区间查询、双指针优化

二维前缀和

  1. 定义:preSum[i][j] 表示左上角(0,0)到(i-1,j-1)的矩阵和
  2. 公式:子矩阵(x1,y1)到(x2,y2)的和 =
    preSum[x2+1][y2+1] - preSum[x1][y2+1] - preSum[x2+1][y1] + preSum[x1][y1]

注意事项

  1. 下标处理
    前缀和数组长度 = 原数组长度 + 1,preSum[0] 必须初始化为0
    原数组是0基,前缀和是1基:
    后缀和必须倒序遍历(从n-1到0),sufSum[n] = 0
  2. 数据溢出
    int类型最多存约2e9,数组累加极易超出范围:
    强制用 long long 定义前缀和/后缀和数组,不用int
  3. 静态数组限制
    前缀和/后缀和是静态预处理:
    原数组修改后,必须重新计算前缀/后缀和
    若数组频繁修改,不要用前缀和
  4. 边界条件
    空数组:n=0时,提前判断,避免循环越界
    单元素数组:公式依然生效(l=r=0,和为arr[0])
http://www.jsqmd.com/news/614795/

相关文章:

  • C# 14 AOT编译Dify客户端时System.Text.Json炸了?深度剖析JsonSerializerContext在AOT模式下的5种崩溃路径(含官方未公开Workaround)
  • LabVIEW网口通讯配置下的Delta台达PLC ModbusTCP协议实现:命令帧读写、数...
  • C++用了20年才让std::string不在堆上分配短字符串——从COW的引用计数到SSO的union trick
  • 让桌面信息管理效率提升3倍的工具
  • 2026年AI使用者核心能力指南:从提示工程到Agent架构的完整知识体系
  • 从 Apache SeaTunnel 走向 ASF Member:一位开发者的长期主义样本凡
  • 我写了一套内容分析系统,专门拆解爆款博主的选题逻辑
  • Innovative Control Strategies for PMSM: Full-Sp...
  • 低空经济找工作不用愁!认准这家垂直招聘平台
  • 中国老龄协会:积极应对人口老龄化中国实践 2025
  • 【精华收藏】Java工程师的智能体转型:20万到60万的年薪跨越,技术人必看
  • 工业场景实测!C#调用YOLOv8/v11的OpenCV DNN vs ONNXRuntime全对比,避坑+选型指南
  • xDeepFM实战解析:如何通过压缩交互网络提升推荐系统的特征交互能力
  • 紫鸟安全管家:正式上线【限制商业信息编辑】 功能 - 速递信息
  • 为什么92%的团队在EF Core 10向量集成中踩坑?:权威披露微软内部验证通过的4层架构分治模型
  • 从OOM每周3次到零故障!SpringBoot+JVM+MySQL全链路性能调优实战
  • EF Core 原生 SQL 实战:FromSql、SqlQuery 与对象映射边界慌
  • 花三分钟读完:2026年马耳他护照中介选型攻略,从此不再被忽悠(实用版) - 速递信息
  • 猫抓浏览器扩展终极指南:3步掌握网页资源嗅探与下载的完整解决方案
  • 第15章 Mosquitto生产环境部署实践
  • Python入门教程(全网最详细),零基础入门到精通,从看这一篇开始!
  • 还在为充气泵电压波动导致MCU复位发愁吗?CSM53系列拥有40V宽压输入配合优秀的瞬态响应,轻松抵御电机启停浪涌,配合2.5μA微功耗,让你的便携充气泵续航提升30%!
  • 20260409紫题训练总结 - Link
  • 小程序挖洞必备神器|集成接口信息收集、路由枚举,Frida注入助力挖洞高效落地(2026-4-8)更新
  • 2026年济南奥迪烧机油治理:口碑与效果双丰收的秘诀
  • 智见未来 | 融合传统视觉与深度学习的AI水位识别技术实践分享
  • 第16章 Mosquitto客户端开发实战
  • 如何在 Go 中超时终止进程及其所有子进程
  • 龙芯k - 走马观碑组MPU驱动移植睬
  • OpenClaw工具拆解之exec