第一行包含两个正整数 N,Q,分别表示彩灯的数量和操纵的次数。
第二行包含 N 个整数,表示彩灯的初始亮度。
接下来 Q 行每行包含一个操纵,格式如下:
l r x,表示将区间 l∼r的彩灯的亮度 +x。
1≤N,Q≤5×1051≤N,Q≤5×105,0≤ai≤1090≤ai≤109,1≤l≤r≤N1≤l≤r≤N,−109≤x≤109−109≤x≤109
输出描述
输出共 1行,包含 N 个整数,表示每个彩灯的亮度。
二、代码实现
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int N = scan.nextInt();
int Q = scan.nextInt();
int []n = new int[N];
for(int i = 0 ; i < N ; i++ ){
n[i] = scan.nextInt();
}
long[] diff = new long[N + 1];
// diff[0] = n[0];
// for(int i = 1 ; i < N ; i++){
// diff[i] = n[i] - n[i-1];
// }
for(int i = 0 ; i < Q ; i++){
int l = scan.nextInt() - 1;
int r = scan.nextInt() - 1;
int x = scan.nextInt();
diff[l] += x;
diff[r + 1] -= x;
}
for(int i = 1 ;i < N ; i++){ //diff被用来记录每次操作的亮度变化量
//eg:diff[1] = diff[0] + diff[1] 表示n[1]总变化量
diff[i] += diff[i-1]; //计算前缀和得到最终亮度的变化
}
for(int i = 0 ; i < N ; i++ ){
long y = n[i] + diff[i];
if(y < 0){
y = 0;
}
System.out.print(y + " ");
}
scan.close();
}
}
复制代码
在代码中,
`for(int i = 1 ; i < N ; i++) { diff += diff[i-1]; }`
这一行代码的作用是 " 计算差分数组的前缀和 ",从而得到每个彩灯在全部操纵之后的最终亮度变化量。