题目描述
输入一个长度为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
输入样例:
6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1
输出样例:
3 4 5 3 4 2
样例
import java.util.Scanner;
class Main{
public static void main(String[] args){
int N = 100010 ;
int[] q = new int[N];
//b[n] 指的是 q[n] 前缀和的单项 如q[n]的前缀和是a[n] 那么b[n] = a[n] - a[n-1]
int[] b = new int[N];
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(), m = sc.nextInt();
for(int i = 1; i <= n ;i++){
q[i] = sc.nextInt();
//在区间 [i,i]中插入q[i] ,如在[1,1]中插入q[1] 即初始化差分数组b
insert(b, i, i , q[i]);
}
while((m--)!=0){
int l = sc.nextInt(), r = sc.nextInt(), c = sc.nextInt();
//将序列中[l, r]之间的每个数加上c
insert(b, l, r, c);
}
for(int i = 1; i <= n; i++){
b[i] = b[i - 1] + b[i];
System.out.print(b[i] + " ");
}
}
private static void insert(int[] b, int l, int r, int c){
//从定义来看 前缀和a[i] = b[1] + b[2] + ... + b[i];
//所以 b[l] + c 对 a[1 ~ L-1]无影响 ,因为a[L - 1] = b[1] + b[2] + ... + b[L - 1] 又不加上b[L],怎么会有影响呢
//如果只是单纯的b[l]+ c, 会对后面的所有数a[n] n > l,都会有影响 而题目只要[l,r] 所以在 r + 1 之后的数要 - c
b[l] += c;
b[r + 1] -= c;
}
}