前缀和与差分 Java实现
一维前缀和
class PreSum1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();
int n = scanner.nextInt();
int[] nums = new int[n + 1];
for (int i = 1; i <= n; i++) {
nums[i] = scanner.nextInt();
}
int[] sum = new int[n + 1];
for (int i = 1; i <= n; i++) {
sum[i] = sum[i - 1] + nums[i];
}
for (int i = 0; i < m; i++) {
int l = scanner.nextInt();
int r = scanner.nextInt();
System.out.println(sum[r] - sum[l - 1]);
}
}
}
二维前缀和
class PreSum2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();
int n = scanner.nextInt();
int k = scanner.nextInt();
int[][] nums = new int[m + 1][n + 1];
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
nums[i][j] = scanner.nextInt();
}
}
int[][] sum = new int[m + 1][n + 1];
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + nums[i][j];
}
}
for (int i = 0; i < k; i++) {
int x1 = scanner.nextInt();
int y1 = scanner.nextInt();
int x2 = scanner.nextInt();
int y2 = scanner.nextInt();
System.out.println(sum[x2][y2] - sum[x1 - 1][y2] - sum[x2][y1 - 1] + sum[x1 - 1][y1 - 1]);
}
}
}
一维差分
class PreSub1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();
int n = scanner.nextInt();
int[] nums = new int[n + 1];
for (int i = 1; i <= n; i++) {
nums[i] = scanner.nextInt();
}
int[] sub = new int[n + 1];
for (int i = 1; i <= n; i++) {
sub[i] = nums[i] - nums[i - 1];
}
for (int i = 0; i < m; i++) {
int l = scanner.nextInt();
int r = scanner.nextInt();
int c = scanner.nextInt();
sub[l] += c;
sub[r + 1] -= c;
}
for (int i = 1; i <= n; i++) {
nums[i] = nums[i - 1] + sub[i];
System.out.print(nums[i] + " ");
}
}
}
二维差分
class PreSub2 {
static int[][] sub;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();
int n = scanner.nextInt();
int k = scanner.nextInt();
int[][] nums = new int[m + 1][n + 1];
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
nums[i][j] = scanner.nextInt();
}
}
sub = new int[m + 2][n + 2];
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
insert(i, j, i, j, nums[i][j]);
}
}
for (int i = 0; i < k; i++) {
int x1 = scanner.nextInt();
int y1 = scanner.nextInt();
int x2 = scanner.nextInt();
int y2 = scanner.nextInt();
int c = scanner.nextInt();
insert(x1, y1, x2, y2, c);
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
sub[i][j] += sub[i - 1][j] + sub[i][j - 1] - sub[i - 1][j - 1];
nums[i][j] = sub[i][j];
System.out.print(nums[i][j] + " ");
}
System.out.println();
}
}
static void insert(int x1, int y1, int x2, int y2, int c) {
sub[x1][y1] += c;
sub[x2 + 1][y1] -= c;
sub[x1][y2 + 1] -= c;
sub[x2 + 1][y2 + 1] += c;
}
}