差分数组b的前缀和是数组a
差分数组的主要作用是 当需要对一个数组的部分值进行操作的时候,可以对差分数组的LR处的值进行操作,耗时变小
差分数组的构造:可以理解为ab数组均为空,原数组a的每一个位置[i,i]处插入一个值,那么对于差分数组来说是在
b[L]处加c,b[r+1]处减c。完成差分数组的构建
此时如果有对数组a的某一范围[L,R]的操作,就转变对数组b的b[L]处加c,b[r+1]处减c操作
原理的话就是,数组b的b[L]+=c,b的前缀和数组a,从a[1-(L-1)]的值不变,从a[L,n]都加上了C
但是a[(R+1)-n]处的值不可以改变,所以应该在b[R+1]处减c,此时a[(R+1)-n]加上c,再减去C,不变
package shulun;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class 差分 {
/**
* @param args
* @throws IOException
*/
static int a[];
static int b[];
public static void insert ( int l,int r,int c) {
b[l]+=c;
b[r+1]-=c;
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String p[]=bufferedReader.readLine().split(" ");
int n=Integer.parseInt(p[0]);
int m=Integer.parseInt(p[1]);
a=new int [n+2];
b=new int [n+2];
p=bufferedReader.readLine().split(" ");
for(int i=1;i<=n;i++){
a[i]=Integer.parseInt(p[i-1]);
insert(i, i, a[i]);
}
while(m>0){
m--;
p=bufferedReader.readLine().split(" ");
int l=Integer.parseInt(p[0]);
int r=Integer.parseInt(p[1]);
int c=Integer.parseInt(p[2]);
insert(l, r, c);
}
for(int i=1;i<=n;i++)
{
a[i]=a[i-1]+b[i];
System.out.print(a[i]+" ");
}
}
}