差分 思想:
通过原始数组a,构造差分数组b。由下面两个函数构成:
//差分数组的插入函数
public void insert(int l,int r,int c) {
b[l] += c;
b[r+1] -= c;
}
//a数组
for(int i = 1;i <= n;i ++) {
a[i] = sc.nextInt();
}
//构造差分数组b
for(int i = 1;i <= n;i ++) {
insert(i, i, a[i]);
}
可以得知:原数组a 是 差分数组 b 的前缀和。

输入一个长度为 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.io.*;
import java.util.*;
public class Main{
public static int N = (int)1e6 + 10;
public static int[] a = new int[N]; //原始数组,是差分数组b的前缀和
public static int[] b = new int[N]; //差分数组
//差分数组插入函数
public static void insert(int l, int r, int c) {
b[l] += c;
b[r+1] -= c;
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] arrs1 = br.readLine().split(" ");
int n = Integer.valueOf(arrs1[0]).intValue();
int m = Integer.valueOf(arrs1[1]).intValue();
String[] arrs2 = br.readLine().split(" ");
//前缀和下标从1开始,方便
for(int i = 1;i <= n;i ++) a[i] = Integer.parseInt(arrs2[i-1]);
//构造差分数组b
for(int i = 1;i <= n;i ++) {
insert(i, i, a[i]);
}
while(m -- > 0) {
String[] arrs3 = br.readLine().split(" ");
int l = Integer.parseInt(arrs3[0]);
int r = Integer.parseInt(arrs3[1]);
int c = Integer.parseInt(arrs3[2]);
insert(l, r, c);
}
//求原数组a插入元素后的值结果,相当于求差分数组b的前缀和a
for(int i = 1;i <= n;i ++) {
a[i] = a[i-1] + b[i];
}
for(int i = 1;i <= n;i ++) System.out.print(a[i] + " ");
}
}
796

被折叠的 条评论
为什么被折叠?



