一维差分
输入样例
6 3 //数列数量 操作次数
1 2 2 1 2 1 //输入数列
1 3 1 //将序列中[l, r]之间的每个数加上c
3 5 1
1 6 1
输出样例
3 4 5 3 4 2 //操作后的数列
代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N=100010;
int a[N], b[N];//a是原始数组,b是差分数组
void insert(int l, int r, int num)//差分核心操作
{
b[l] += num;
b[r + 1] -= num;
}
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
insert(i, i, a[i]);//将a数组插入b数组中
}
while (m--)
{
int l, r, c;
scanf("%d%d%d", &l, &r, &c);
insert(l, r, c);
}
for (int i = 1; i <= n; i++)
{
a[i] = a[i - 1] + b[i];// a[i]的值是b数组的前缀和
printf("%d ", a[i]);
}
return 0;
}
二维差分
输入样例
3 4 3 //矩阵行数 矩阵列数 操作次数
1 2 2 1 //输入矩阵
3 2 2 1
1 1 1 1
1 1 2 2 1 //将(x1,y1),(x2,y2)间的每个元素的值加上c
1 3 2 3 2
3 1 3 4 1
输出样例
2 3 4 1 //操作后的矩阵
4 3 4 1
2 2 2 2
代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int a[N][N], b[N][N];//a是原始矩阵,b是差分矩阵
void insert(int x1,int y1,int x2,int y2,int num)//差分核心操作
{
b[x1][y1] += num;
b[x1][y2 + 1] -= num;
b[x2 + 1][y1] -= num;
b[x2 + 1][y2 + 1] += num;
}
int main()
{
int n, m, q;
cin >> n >> m >> q;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
scanf("%d", &a[i][j]);
insert(i, j, i, j, a[i][j]);//将a矩阵插入b矩阵中
}
while (q--)
{
int x1, y1, x2, y2, c;
scanf("%d%d%d%d%d", &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++)
{
a[i][j] = a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1] + b[i][j];// a[i][j]的值是b矩阵的前缀和
printf("%d", a[i][j]);
if (j == m)
printf("\n");
else
printf(" ");
}
return 0;
}