济南市建设工程交易网百度seo点击工具
文章目录
- 差分
- 一维差分
- 题解
- 代码
- 二维差分
差分
区间修改时使用差分
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;
}