18440二维差分
18440二维差分
⭐️难度:中等
📖
📚
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
int q = scanner.nextInt();
int[][] a = new int[1010][1010];
int[][] b = new int[1010][1010];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
a[i][j] = scanner.nextInt();
b[i][j] = a[i][j] + a[i-1][j-1] - a[i-1][j] - a[i][j-1]; // 求差分数组
}
}
// 子矩阵求和
for (int i = 0; i < q; i++) {
int x1 = scanner.nextInt();
int y1 = scanner.nextInt();
int x2 = scanner.nextInt();
int y2 = scanner.nextInt();
int d = scanner.nextInt();
b[x1][y1] += d;
b[x1][y2+1] -= d;
b[x2+1][y1] -= d;
b[x2+1][y2+1] += d;
}
// 差分数组求前缀和还原原数组
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
b[i][j] = b[i][j] - b[i-1][j-1] + b[i-1][j] + b[i][j-1]; // 直接用b数组求前缀和
System.out.print(b[i][j]+" ");
}
System.out.println();
}
}
}
🐱笔记
背公式,用公式。