AcWing 797. 差分
原题链接
简单
作者:
莫得感情的刷题机器
,
2020-08-10 15:04:46
,
所有人可见
,
阅读 354
/**
* 差分和前缀和是逆运算 例如 a1,a2...an是b1,b2...bn的前缀和 那么b1..bn就是a1...an的差分。
* ai=b1+b2+...bi
* b1=a1 b2=a2-a1 b3=a3-a2 bn=an-an-1;
* 由b可以在on时间得到a
*
* 从这个题可以看出 差分的作用就是,如果对一个数组连续部分进行连续操作 让你求最后结果
* 那么就找他的差分数组,然后每次都是o1时间去改,这样总体还是on,而不是oN平方。
*
*如果对某一个段进行变化 差分怎么变呢 例如 对a的i-j段+c
* 那么b数组就是 bi+c,bj+1-c (i和j+1是坐标的哈)
* 构造初始化的b数组可以把 a看做是i i 位+a[i];
*
*/
import java.util.*;
public class Main{
static int[] b;
static int[] a;
public static void main(String [] args){
int N=100009;
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
a=new int[N];
b=new int[N];
for(int i=1;i<=n;i++){
a[i]=sc.nextInt();
insert(i,i,a[i]);//把最开始看做a是全0,那么b一定也是全0,那么相当于每个位置+a[i]...
}
for(int i=1;i<=m;i++){
int l=sc.nextInt();
int r=sc.nextInt();
int c=sc.nextInt();
insert(l,r,c);
}
for(int i=1;i<=n;i++) a[i]=a[i-1]+b[i];
for(int i=1;i<=n;i++) System.out.print(a[i]+" ");
}
public static void insert(int i,int j,int c){//因为初始化数组的关系 这里不用考虑越界。。
b[i]+=c;
b[j+1]-=c;
}
}