前缀和以及差分模板
一、前缀和
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n;
cin>>n;
//一维数组
//被称作区间和 可以求 [l,r]之间的和
vector<int> v(n+1),sum(n+1);
for(int i=1;i<=n;i++){
cin>>v[i];
sum[i]=sum[i-1]+v[i];
}
//每一项的前缀和
for(int i=1;i<=n;i++){
cout<<sum[i]<<" ";
}
cout<<endl;
int l,r;
cin>>l>>r;
cout<<sum[r]-sum[l-1]<<endl;
//二维数组
//称作区块和 ,可以求每一个区块的和
vector<vector<int>> v(n+1,vector<int>(n+1));
vector<vector<int>> sum(n+1,vector<int>(n+1));
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>v[i][j];
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+v[i][j];
}
}
// 区块和
// res=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1]
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<sum[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
二、差分
//一维数组的差分
//一维数组的差分
#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;
//标准的差分问题
int main() {
int n,q;
cin>>n>>q;
vector<int> a(n+1,0),diff(n+1,0);
for(int i=1; i<=n; i++) {
cin>>a[i];
diff[i]=a[i]-a[i-1];
}
int l,r,c;
while(q--) {
cin>>l>>r>>c;
diff[l]+=c;
diff[r+1]-=c;
}
for(int i=1; i<=n; i++) {
diff[i]+=diff[i-1];
cout<<diff[i]<<" ";
}
return 0;
}
二维数组的差分
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int diff[1001][1001],a[10001][1001];
void insert(int x1,int y1,int x2,int y2,int c){
diff[x1][y1]+=c;
diff[x2+1][y1]-=c;
diff[x1][y2+1]-=c;
diff[x2+1][y2+1]+=c;
}
int main(){
int n,m,q;
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>a[i][j];
insert(i,j,i,j,a[i][j]);
}
int x1,x2,y1,y2,c;
while(q--){
cin>>x1>>y1>>x2>>y2>>c;
insert(x1,y1,x2,y2,c);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
diff[i][j]+=diff[i-1][j]+diff[i][j-1]-diff[i-1][j-1];
cout<<diff[i][j]<<" ";
if(j==m)cout<<endl;
}
return 0;
}