问题来源 : ACWing
https://www.acwing.com/blog/content/277/
前缀和
#include <iostream>
using namespace std;
const int N = 1e5 + 100;
int f[N],S[N];
int n,m;
int l,r;
int main() {
cin >> n >> m;
for(int i = 0; i < n; i++) scanf("%d",&f[i]);
for(int i = 1; i <= n; i++) S[i] = S[i-1] + f[i-1];
while( m-- ) {
scanf("%d %d",&l,&r);
printf("%d\n",S[r] - S[l-1]);
}
return 0;
}
子矩阵的和
#include <iostream>
using namespace std;
const int N = 1010;
int n,m,u;
int x1,y1,x2,y2;
int f[N][N],S[N][N];
int main(){
cin >> n >> m >> u;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++) cin >> f[i][j];
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++) S[i][j] = S[i-1][j] + S[i][j-1] - S[i-1][j-1] + f[i][j];
while(u -- ) {
cin >> x1 >> y1 >> x2 >> y2;
printf("%d\n",S[x2][y2] - S[x1-1][y2] - S[x2][y1-1] + S[x1-1][y1-1]);
}
return 0;
}
差分
#include <iostream>
using namespace std;
const int N = 100010;
int f[N],t[N];
int n,m;
inline void insert(const int l,const int r,const int c) {
t[l] += c;
t[r+1] -= c;
}
int main() {
cin >> n >> m;
for(int i = 1; i <= n; i++) cin >> f[i];
for(int i = 1; i <= n; i++) t[i] = f[i] - f[i-1];
while(m --) {
int l,r,c;
cin >> l >> r >> c;
insert(l,r,c);
}
for(int i = 1; i <= n; i++) {
t[i] += t[i-1];
cout << t[i] << " ";
}
return 0;
}
差分矩阵
#include <iostream>
using namespace std;
const int N = 1010;
int f[N][N],t[N][N];
int n,m,q;
inline void insert(int x1,int y1,int x2,int y2,int c) {
t[x1][y1] += c;
t[x1][y2+ 1] -= c;
t[x2 + 1][y1] -= c;
t[x2 + 1][y2 + 1] += c;
}
int main() {
cin >> n >> m >> q;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++) cin >> f[i][j];
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j ++) insert(i,j,i,j,f[i][j]);
while(q --) {
int x1,y1,x2,y2,c;
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++) t[i][j] += t[i-1][j] + t[i][j-1] - t[i-1][j-1];
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) cout << t[i][j] << " ";
cout << endl;
}
return 0;
}