目录
介绍
前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和,而差分可以看成前缀和的逆运算。合理的使用前缀和与差分,可以将某些复杂的问题简单化。
【模版】一维前缀和
模版前缀和【模板】前缀和_牛客题霸_牛客网
算法思路:
a.
先预处理出来⼀个「前缀和」数组:
⽤
dp[i]
表⽰:
[1, i]
区间内所有元素的和,那么
dp[i - 1]
⾥⾯存的就是
[1,i - 1] 区间内所有元素的和,那么:可得递推公式:
dp[i] = dp[i - 1] +arr[i] ;
b.
使⽤前缀和数组,「快速」求出「某⼀个区间内」所有元素的和:当询问的区间是 [l, r]
时:区间内所有元素的和为:
dp[r] - dp[l - 1]
。
代码实现
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;cin>>n;
vector<int>s(n+1);
int q=0;cin>>q;
for(int i=1;i<=n;i++)cin>>s[i];
vector<long long>dp(n+1);//防止数据溢出
for(int i=0;i<=n;i++)
dp[i]=dp[i-1]+s[i];
while(q--)
{
int r=0,l=0;
cin>>r>>l;
cout<<dp[l]-dp[r-1]<<endl;
}
return 0;
}
【模版】二维前缀和
【模版二维前缀和】【模板】二维前缀和_牛客题霸_牛客网
算法思路
类⽐于⼀维数组的形式,如果我们能处理出来从
[0, 0]
位置到
[i, j]
位置这⽚区域内所有
元素的累加和,就可以在
O(1)
的时间内,搞定矩阵内任意区域内所有元素的累加和。因此我们接下来仅需完成两步即可:
◦
第⼀步:搞出来前缀和矩阵
这⾥就要⽤到⼀维数组⾥⾯的拓展知识,我们要在矩阵的最上⾯和最左边添加上⼀⾏和⼀列0,这样我们就可以省去⾮常多的边界条件的处理(同学们可以⾃⾏尝试直接搞出来前缀和矩阵,边界条件的处理会让你崩溃的)。处理后的矩阵就像这样:

这样,我们填写前缀和矩阵数组的时候,下标直接从
1
开始,能⼤胆使⽤
i - 1
,
j - 1
位置的值。
注意
dp
表与原数组
matrix
内的元素的映射关系:
i.
从
dp
表到
matrix
矩阵,横纵坐标减⼀;
ii.
从
matrix
矩阵到
dp
表,横纵坐标加⼀。
前缀和矩阵中
sum[i][j]
的含义,以及如何递推⼆维前缀和⽅程
a.
sum[i][j]
的含义:
sum[i][j]
表⽰,从