一维差分:
题目描述:
bi的前缀和为ai:
b1=a1
b2=a2-a1
b3=a3-a2
.......
#include <bits/stdc++.h>
using namespace std;
int a[100010],b[100010],s[100010];
int main()
{
int n,m;
cin >> n>>m;
for(int i=1;i<=n;i++) cin >> a[i];
b[1]=a[1];
for(int i=2;i<=n;i++) b[i]=a[i]-a[i-1];
while(m--){
int l,r,c;
cin >> l >> r >> c;
b[l]=b[l]+c;
b[r+1]=b[r+1]-c;
}
for(int i=1;i<=n;i++) {
s[i]=s[i-1]+b[i];
cout << s[i]<<" ";
}
/*
for(int i=1;i<=n;i++) b[i]+=b[i-1];
cout << b[i]<<" ";
*/
}
二维差分:
题目描述:
思路:
(1)还是把a[i][j]看成b[i][j]的前缀和;利用前缀和的公式逆推求b[i][j]
(2)对b[i][j]进行处理
(3)求b[i][j]的前缀和 输出
#include <bits/stdc++.h>
using namespace std;
const int N=1010;
int a[N][N],b[N][N],s[N][N];
int main()
{
int n,m,t;
cin >> n >> m>> t;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) cin >> a[i][j];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) {
b[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1];
//逆运算 :s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
}
}
while(t--){
int x1,x2,y1,y2,c;
cin >> x1 >> y1 >> x2 >> y2 >> c;
// 叠加运算 存住了上一次的运算 要是想每次都是原数据可以在最后恢复
b[x1][y1]+=c;
b[x2+1][y1]-=c;
b[x1][y2+1]-=c;
b[x2+1][y2+1]+=c;
}
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]+b[i][j];
cout << s[i][j]<<" ";
}
cout << endl;
}
}