一维差分
所谓差分其实就是前缀和的逆运算!已知存在数列:
引例
问题描述:
输入一个长度为
的整数序列。 接下来输入 个操作,每个操作包含三个整数 ,表示将序列中 之间的每个数加上 。 请你输出进行完所有操作后的序列。
当我们在数列
那么我们如何构造初始的数列
cpp
#include <iostream>
using namespace std;
int const N = 1e6 + 10;
int n,m, a[N], b[N];
void insert(int l, int r, int c) {
b[l] += c;
b[r + 1] -= c;
}
int main() {
cin >> n >> m;
// 读入a 构造b
for(int i = 1; i <= n; i++) {
cin >> a[i];
insert(i, i, a[i]);
}
// m个询问
while(m --) {
int l, r, c;
cin >> l >> r >> c;
insert(l, r, c);
}
// 对b求前缀和,结果即是更新后的a数组
for(int i = 1; i <= n; i++) {
b[i] += b[i - 1]; // 这里我们为了节省空间直接修改了b数组,大家也可以开sum数组用原始方法求前缀和
cout << b[i] << " ";
}
return 0;
}二维差分

模板例题
输入一个
输入格式
第一行包含整数
输出格式
共 n 行,每行 m 个整数,表示所有操作进行完毕后的最终矩阵。
样例输入
3 4 3
1 2 2 1
3 2 2 1
1 1 1 1
1 1 2 2 1
1 3 2 3 2
3 1 3 4 1样例输出
2 3 4 1
4 3 4 1
2 2 2 2参考代码
cpp
#include <iostream>
using namespace std;
int const N = 1010;
int a[N][N], b[N][N], n, m, q;
void insert(int x1, int y1, int x2, int y2, int c) {
b[x1][y1] += c;
b[x1][y2 + 1] -= c;
b[x2 + 1][y1] -= c;
b[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 >> a[i][j];
insert(i, j, i, j, a[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++) {
b[i][j] += b[i - 1][j] + b[i][j - 1] - b[i - 1][j - 1];
cout << b[i][j] << " ";
}
cout << endl;
}
return 0;
}