差分可以降低时间复杂度,提高算法效率
什么是差分呢?
有原数组a[1],a[2]...a[n];
然后给定数组B,使得B数组满足a[i]=B[1]+B[2]...+B[i];
所以对B数组的初始化可以变成B[i]=a[i]-a[i-1];
也可以根据规律发现B[i]只要加上一个值,就可以对a[i]往后的数值产生变化(加上该值)
以此类推
不难发现a[0]需要初始化一下(一般情况为0)这也是为什么从数组下标为1开始
差分数组可以解决怎么样的问题呢?
Acwing上的题目:
输入一个长度为n的整数序列。
接下来输入m个操作,每个操作包含三个整数l, r, c,表示将序列中[l, r]之间的每个数加上c。
请你输出进行完所有操作后的序列。
输入格式
第一行包含两个整数n和m。
第二行包含n个整数,表示整数序列。
接下来m行,每行包含三个整数l,r,c,表示一个操作。
输出格式
共一行,包含n个整数,表示最终序列。
数据范围
1≤n,m≤100000,
1≤l≤r≤n,
−1000≤c≤1000,
−1000≤整数序列中元素的值≤1000
1
2
3
4
输入样例:
6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1
1
2
3
4
5
输出样例:
3 4 5 3 4 2
AC代码:
#include<iostream>
using namespace std;
const int N = 1e6+10;
int a[N],b[N];
void insert(int x,int y,int z){
b[x]+=z;
b[y+1]-=z;//打补丁
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
cin>>a[i];//a数组只是作为踏板
}
for(int i=1;i<=n;i++){
insert(i,i,a[i]);
}
int l=0,r=0;
int c=0;
for(;m;m--){
cin>>l>>r>>c;
insert(l,r,c);
}
for(int i=1;i<=n;i++){
b[i]+=b[i-1];
}
for(int i=1;i<=n;i++)cout<<b[i]<<' ';
return 0;
}