一、一维前缀和
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int m=in.nextInt();
int[] prefix=new int[n+1];
int[] arr=new int[n+1];
for (int i = 1; i < arr.length; i++) {
arr[i]=in.nextInt();
prefix[i]=prefix[i-1]+arr[i];
}
int l=0;
int r=0;
for (int i = 0; i < m; i++) {
l=in.nextInt();
r=in.nextInt();
System.out.println(prefix[r]-prefix[l-1]);
}
}
}
二、二维前缀和
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int m=in.nextInt();
int q=in.nextInt();
long[][] dp=new long[n+1][m+1];
int[][] arr=new int[n+1][m+1];
for (int i = 1; i < arr.length; i++) {
for (int j = 1; j < arr[0].length; j++) {
arr[i][j]=in.nextInt();
dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+arr[i][j];
}
}
int x1=0;
int y1=0;
int x2=0;
int y2=0;
for (int i = 0; i < q; i++) {
x1=in.nextInt();
y1=in.nextInt();
x2=in.nextInt();
y2=in.nextInt();
System.out.println(dp[x2][y2]-dp[x2][y1-1]-dp[x1-1][y2]+dp[x1-1][y1-1]);
}
}
}
三、一维差分
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int q=in.nextInt();
int[] diff=new int[n+2];
int[] arr=new int[n+1];
int[] res=new int[n+1];
for (int i = 1; i < arr.length; i++) {
arr[i]=in.nextInt();
diff[i]=arr[i]-arr[i-1];
}
int l=0;
int r=0;
int x=0;
for (int i = 0; i < q; i++) {
l=in.nextInt();
r=in.nextInt();
x=in.nextInt();
diff[l]+=x;
diff[r+1]-=x;
}
for (int i = 1; i < res.length; i++) {
res[i]=res[i-1]+diff[i];
}
for (int i = 1; i < res.length; i++) {
System.out.print(res[i]+" ");
}
}
}
四、二维差分
待更。。