解析代码
刚学差分进入一个死胡同:到底在求啥?!
实际上是通过给区间[l, r]中的每个数加上 c:B[l] += c, B[r + 1] -= c
这样的操作对差分数组b[N]进行一顿操作,但是实际上,对b[N]操作是为了改变原始数组a[N],所以解决完b[N]的处理要对b[N]进行求前缀和,也就是求出被影响后的a[N]。如何求出a[N]有两种简单写法,在最下面的图片上列举了出来。
另外一个问题就是:
对差分数组初始化的部分,为什么可以使用insert(i,i,a[i])
,具体分析步骤在下面的图片上:
感谢大佬的源代码,大佬的题解在这儿: AcWing 797. 差分 【c++详细题解】
代码1
//简单版本
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static final int N = 100010;
public static final int[] a = new int[N]; //原数组
public static final int[] b = new int[N]; //差分数组
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().split(" ");
int n = Integer.parseInt(s[0]); //数组长度
int m = Integer.parseInt(s[1]); //操作次数
s = br.readLine().split(" ");
for(int i = 1;i <= n;i++) {
a[i] = Integer.parseInt(s[i-1]);
}
initb(n); //对差分数组初始化
while (m > 0) {
s = br.readLine().split(" ");
int l = Integer.parseInt(s[0]);
int r = Integer.parseInt(s[1]);
int c = Integer.parseInt(s[2]);
insert(l, r, c);
m--;
}
for (int i = 1; i <= n; i++) {
// a[i] = a[i - 1] + b[i];
// System.out.print(a[i] + " ");
b[i] += b[i - 1];
System.out.print(b[i] + " ");
}
}
public static void initb(int n) {
for (int i = 1; i <= n; i++) {
b[i] = a[i] - a[i - 1];
}
}
public static void insert(int l, int r, int c) {
b[l] += c;
b[r + 1] -= c;
}
}
代码2
//进阶简化版:主要简化了初始化差分数组的方法,少创建了一个函数
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static final int N = 100010;
public static final int[] a = new int[N]; //原数组
public static final int[] b = new int[N]; //差分数组
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().split(" ");
int n = Integer.parseInt(s[0]); //数组长度
int m = Integer.parseInt(s[1]); //操作次数
s = br.readLine().split(" ");
for(int i = 1;i <= n;i++) {
a[i] = Integer.parseInt(s[i-1]);
}
//对差分数组初始化
for(int i = 1;i <= n;i++) {
insert(i,i,a[i]);
}
while (m > 0) {
s = br.readLine().split(" ");
int l = Integer.parseInt(s[0]);
int r = Integer.parseInt(s[1]);
int c = Integer.parseInt(s[2]);
insert(l, r, c);
m--;
}
for (int i = 1; i <= n; i++) {
// a[i] = a[i - 1] + b[i];
// System.out.print(a[i] + " ");
b[i] += b[i - 1];
System.out.print(b[i] + " ");
}
}
public static void insert(int l, int r, int c) {
b[l] += c;
b[r + 1] -= c;
}
}