import java.io.*; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int n = Integer.parseInt(st.nextToken()); int m = Integer.parseInt(st.nextToken()); long[] a = new long[n + 1]; st = new StringTokenizer(br.readLine()); for (int i = 1; i <= n; i++) { a[i] = Long.parseLong(st.nextToken()); } long[] d = new long[n + 2]; d[1] = a[1]; for (int i = 2; i <= n; i++) { d[i] = a[i] - a[i - 1]; } for (int i = 0; i < m; i++) { st = new StringTokenizer(br.readLine()); int l = Integer.parseInt(st.nextToken()); int r = Integer.parseInt(st.nextToken()); long k = Long.parseLong(st.nextToken()); d[l] += k; if (r + 1 <= n + 1) { d[r + 1] -= k; } } long[] result = new long[n + 1]; result[1] = d[1]; for (int i = 2; i <= n; i++) { result[i] = result[i - 1] + d[i]; } StringBuilder sb = new StringBuilder(); for (int i = 1; i <= n; i++) { sb.append(result[i]).append(' '); } System.out.println(sb.toString().trim()); } }
https://www.nowcoder.com/discuss/727521113110073344
思路:
- 输入处理:使用BufferedReader和StringTokenizer高效读取输入数据。
- 差分数组初始化:根据初始数组构造差分数组,其中d[i] = a[i] - a[i-1]。
- 区间修改处理:对于每个区间修改操作,更新差分数组的两个位置,时间复杂度为O(1)。
- 前缀和计算:通过差分数组计算前缀和,得到最终的结果数组。
- 结果输出:将结果数组转换为字符串输出。