前缀和与差分java模板代码
Posted 知道什么是码怪吗?
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前缀和与差分java模板代码相关的知识,希望对你有一定的参考价值。
一维前缀和
Scanner input=new Scanner(System.in);
int n=input.nextInt();
int[] nums=new int[n+10];
int[] result=new int[n+10];
for(int i=1;i<=n;i++){
nums[i]=input.nextInt();//接收数据
}
for(int i=1;i<=n;i++){
result[i]=result[i-1]+nums[i];//求一维前缀和
}
二维前缀和
Scanner input=new Scanner(System.in);
int n=input.nextInt();
int m=input.nextInt();
int q=input.nextInt();
int[][] nums=new int[n+10][m+10];
int[][] result=new int[n+10][m+10];//result[i][j] = 第i行j列格子左上部分所有元素的和
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
nums[i][j]=input.nextInt();//接收数据
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
result[i][j]=nums[i][j]+result[i-1][j]+result[i][j-1]-result[i-1][j-1];//求二维前缀和
}
}
int x1=input.nextInt();
int y1=input.nextInt();
int x2=input.nextInt();
int y2=input.nextInt();
//以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和
System.out.println(result[x2][y2]-result[x1-1][y2]-result[x2][y1-1]+result[x1-1][y1-1]);
一维差分
import java.util.*;
public class Main{
static int[] result=new int[100010];
public static void Insert(int left,int right,int number){
result[left]+=number;
result[right+1]-=number;
}
public static void main(String args[]){
Scanner input=new Scanner(System.in);
int n=input.nextInt();
int m=input.nextInt();
int[] nums=new int[n+10];
for(int i=1;i<=n;i++){
nums[i]=input.nextInt();//接收数据
}
for(int i=1;i<=n;i++)//求差分数组
Insert(i,i,nums[i]);
}
}
二维差分
import java.util.*;
public class Main{
static int[][] result=new int[1010][1010];
//只需要考虑更新,不需要考虑怎么构造差分数组
//矩阵左上角(x1,y1) 右下角(x2,y2)
public static void Insert(int x1,int y1,int x2,int y2,int number){
result[x1][y1]+=number;
result[x1][y2+1]-=number;
result[x2+1][y1]-=number;
result[x2+1][y2+1]+=number;
}
public static void main(String args[]){
Scanner input=new Scanner(System.in);
int n=input.nextInt();
int m=input.nextInt();
int q=input.nextInt();
int[][] nums=new int[n+10][m+10];
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
nums[i][j]=input.nextInt();//接收数据
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
Insert(i,j,i,j,nums[i][j]);//构造差分数组
}
}
}
}
以上是关于前缀和与差分java模板代码的主要内容,如果未能解决你的问题,请参考以下文章