#define get_sum(L,R)(L?sum[R]-sum[L-1]:sum[R])
一维缀和
#include<iostream>//一维前缀和
using namespace std;
//#define get_sum(L,R)(L?sum[R]-sum[L-1]:sum[R])
const int n=5;
int sum[n];
int get_sum(int L,int R)
{
if(L!=0) return sum[R]-sum[L-1];
else return sum[R];
}
int main()
{
int arr[n]={1,3,7,5,2};
int sum[n];
sum[0]=arr[0];
for(int i=1;i<n;i++)
sum[i]=sum[i-1]+arr[i];
cout<<get_sum(2,4)<<endl;
cout<<get_sum(0,3)<<endl;
cout<<get_sum(3,4)<<endl;
}
二维前缀和
#include<bits/stdc++.h>
using namespace std;
const int n=3,m=4;
int g[n][m]={{1,5,6,8},
{9,6,7,3},
{5,3,2,4}};
int sum[n][m];
void pre_sum()
{
sum[0][0]=g[0][0];
for(int i=1;i<n;i++)sum[i][0]=sum[i-1][0]+g[i][0];
for(int j=1;j<m;j++)sum[0][j]=sum[0][j-1]+g[0][j];
for(int i=1;i<n;i++){
for(int j=1;j<m;j++){
sum[i][j]=g[i][j]+sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1];
}
}
}
int get_sum(int x1,int y1,int x2,int y2)
{
if(!x1&&!y1) return sum[x2][y2];
if(!x1) return sum[x2][y2]-sum[x2][y1-1];
if(!y1) return sum[x2][y2]-sum[x1-1][y2];
return sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y1]+sum[x1-1][y1-1];
}
int main()
{
pre_sum;
cout<<get_sum(1,1,2,2)<<" "<<get_sum(0,1,1,3);
return 0;
}
一维差分数组
#include<bits/stdc++.h>//一维差分数组
using namespace std;
int d[6]={0};
void add(int l,int r,int v)
{
d[l]+=v;
d[r+1]-=v;
}
int main()
{
int arr[5]={1,3,7,5,2};
add(2,4,5);
add(1,3,2);
add(0,2,-3);
for(int i=1;i<5;i++) d[i]+=d[i-1];
for(int i=0;i<5;i++){
arr[i]+=d[i];
cout<<arr[i]<<" ";
}
memset(d,0,sizeof(d));
}