###差分数组
差分数组其实是前缀和数组的逆运算
一维差分
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N] , b[N];//a[N]是b[N]的前缀和 ,b[N]是a[N]的差分数组
//差分数组,可以用于在他的前缀和组中增加一个数c
//比如在[l , r]数组中增加 c 那么只需在 吧b[l] += c 而 b[r+1] -= c就可以
int main()
{
int n,m;
cin>>n>>m;
for (int i = 1 ; i <= n ; i ++) cin>>a[i];
for (int i = 1 ; i <= n ; i ++) b[i] = a[i] - a[i-1];初始化差分数组
while (m --)
{
int l ,r , c;
cin>>l>>r>>c;
b[l] += c;
b[r+1] -= c;
}
for (int i = 1 ; i <= n ; i ++)b[i] += b[i-1];将差分数组转化为a[N]
for (int i = 1 ; i <= n ; i ++) cout<<b[i]<<" ";
return 0;
}
二维差分
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
int a[N][N] , b[N][N];
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];
//初始化差分数组 , 根据图来分析差分数组怎么通过他的前缀和数组来计算得出
for (int i = 1 ; i <= n ; i ++)
for (int j = 1 ; j <= m ; j ++) b[i][j] = a[i][j] - a[i][j-1] - a[i-1][j] + a[i-1][j-1];
while (q --)
{
int x1 , y1, x2 , 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 ++)
b[i][j] += b[i][j-1] + b[i-1][j] - b[i-1][j-1];
for (int i = 1 ; i <= n ; i ++)
{
//增加c的思路与一维的差分思路一样,通过图来辅助增加的思路
for (int j = 1 ; j <= m ; j ++)
{
cout<<b[i][j]<<" ";
}
cout<<endl;
}
return 0;
}