专栏文章
浅谈前缀和(一维)
算法·理论参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miod753x
- 此快照首次捕获于
- 2025/12/02 17:17 3 个月前
- 此快照最后确认于
- 2025/12/02 17:17 3 个月前
前缀和的用途
前缀和是一种常用的算法技巧,通过预处理数组来快速计算某个区间的和。它的核心思想是利用空间换时间,预先计算出数组的前缀和,从而在查询时能够快速得到结果
一维前缀和的基本思想
一维前缀和的基本思想是构建一个新的数组 ,其中 表示原数组从第 个元素到第 个元素的和。这样,在查询某个区间 的和时,时间复杂度为
求前缀和数组
前缀和数组的第 项就是原数组从第 个元素到第 个元素的和,用代码写出来很简单
CPPfor (int i = 1; i <= n; i++){
b[i] = b[i - 1] + a[i];
}
是前 项的和,那么求前 项的和就用当前项 加上 就可以了
原数组
前缀和数组
前缀和求区间和的公式
求出了前缀和数组又怎样求一个区间的和呢?
我们假设这个区间是 ,原数组 ,那么前缀和数组 ,设 , ,显而易见,区间和为 ,那怎么用代码写出来呢?我们可以用前 项的和减去前 项的和得到区间和,这与 和 有什么关系呢?我们发现 就等于 , 就等于 ,所以我们得出一个公式:
的区间和
所以用代码写就是
CPPint ans = b[r] - b[l - 1];//[l,r] 的区间和
一维前缀和最终代码
CPP#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, a[N], b[N], l, r;
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%d", &a[i]);
b[i] = b[i - 1] + a[i];//求前缀和数组
}
scanf("%d%d", &l, &r);
int ans = b[r] - b[l - 1];//[l,r] 的区间和
printf("%d", ans);
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...