一,小明的彩灯
1.题目描述:
题目描述
小明拥有 NN 个彩灯,第 ii 个彩灯的初始亮度为 aiai。
小明将进行 QQ 次操作,每次操作可选择一段区间,并使区间内彩灯的亮度 +x+x(xx 可能为负数)。
求 QQ 次操作后每个彩灯的亮度(若彩灯亮度为负数则输出 00)。
输入描述
第一行包含两个正整数 N,QN,Q,分别表示彩灯的数量和操作的次数。
第二行包含 NN 个整数,表示彩灯的初始亮度。
接下来 QQ 行每行包含一个操作,格式如下:
l r x
,表示将区间 l∼rl∼r 的彩灯的亮度 +x+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
输出描述
输出共 11 行,包含 NN 个整数,表示每个彩灯的亮度。
2.实例:
示例 1
输入
5 3
2 2 2 1 5
1 3 3
4 5 5
1 1 -100
输出
0 5 5 6 10
3.思路:
输入处理:使用
BufferedReader
读取输入数据,解析出彩灯数量N
和操作次数Q
。初始亮度数组:将彩灯的初始亮度存入数组
a
,索引从1到N。差分数组初始化:创建差分数组
diff
,用于记录区间操作的变化。区间操作处理:对于每个区间操作,更新差分数组的相应位置。
前缀和计算:通过计算差分数组的前缀和,得到每个位置的总增量
inc
。结果计算:将初始亮度与总增量相加,处理负数情况,输出结果。
4:代码:
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] line = br.readLine().split(" ");
int N = Integer.parseInt(line[0]);
int Q = Integer.parseInt(line[1]);
int[] a = new int[N + 1];
line = br.readLine().split(" ");
for (int i = 1; i <= N; i++) {
a[i] = Integer.parseInt(line[i - 1]);
}
int[] diff = new int[N + 2]; // 差分数组,索引1到N+1
for (int q = 0; q < Q; q++) {
line = br.readLine().split(" ");
int l = Integer.parseInt(line[0]);
int r = Integer.parseInt(line[1]);
int x = Integer.parseInt(line[2]);
diff[l] += x;
diff[r + 1] -= x;
}
// 计算前缀和得到每个位置的增量
long[] inc = new long[N + 1];
for (int i = 1; i <= N; i++) {
inc[i] = inc[i - 1] + diff[i];
}
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= N; i++) {
long res = a[i] + inc[i];
if (res < 0) {
sb.append(0);
} else {
sb.append(res);
}
if (i < N) {
sb.append(' ');
}
}
System.out.println(sb.toString());
}
}