算法差分详解 + 总结
文章目录
- 差分
- 一维差分
- 题解
- 代码
- 二维差分
差分
区间修改时使用差分
1. 先预处理一个差分数组,cre[i] = a[i] - a[i-1],对差分数组求前缀和可以还原为原数组
2. 如果要让区间内的数+d,比如[l,r]内+d,那么r+1区间-d可以达到这样的效果,原数组[l,r]区间就+d了,只需要让差分数组第一个数加d,前缀和后后面的数都加上了d,所以让r+1以及后面的数-d,恢复原来的情况
举个例子
原数组: 1 2 2 1 2 1
差分数组: 1 1 0 -1 1 -1
对[1,3]区间+1
修改差分数组: 2 1 0 -2 1 -1
前缀和差分数组: 2 3 3 1 2 1
一维差分
题目链接
题解
1. 先预处理一个差分数组,对差分数组,区间[l,r]修改,l下标的数加上d,r+1下标的数减去d,[l,r]区间就加上了d,最后求下前缀和数组就达到了修改原数组的目的
代码
#include <iostream>
using namespace std;
const int N = 2e5 + 10;
int a[N];
int cre[N];
int pre[N];
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++)
{
// 差分数组
cre[i] = a[i] - a[i-1];
}
while(m--)
{
int l,r,d;
cin >> l >> r >> d;
cre[l] += d;
cre[r+1] -= d;
}
for(int i = 1;i <= n;i++)
{
// 对差分数组求前缀和
pre[i] = pre[i-1] + cre[i];
}
for(int i = 1;i <= n;i++) cout << pre[i] << " ";
cout << '\n';
return 0;
}