AcWing 99. x2开始遍历
原题链接
简单
作者:
季之秋
,
2021-02-28 20:14:41
,
所有人可见
,
阅读 332
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int R=sc.nextInt();
if(R==0){
System.out.println(0);
return ;
}
int s[][]=new int[5010][5010];
int dx=R,dy=R; //这样从x2开始走至少可以走一步
for(int i=0;i<n;i++){
int x=sc.nextInt()+1; //防止前缀和越界
dx=Math.max(x,dx); //最大需要计算到哪里的前缀和
int y=sc.nextInt()+1;
dy=Math.max(y,dy);
s[x][y]+=sc.nextInt(); //可能存在一个点多个值
}
for(int i=1;i<=dx;i++){
for(int j=1;j<=dy;j++){
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+s[i][j];//前缀和公式
}
}
int res=0;
for(int x2=R;x2<=dx;x2++){ //遍历x2从R开始,因为x1是从1开始
for(int y2=R;y2<=dy;y2++){ //如果遍历x1就会发生一步都不计算的情况,因为x1+R-1<=dx 当R=dx时一步都不计算
//结果就会是0,就算加特判也要考虑dx=R或者dy=R两种情况不同的计算方式
//从x2开始就省去一些特判,哪怕dx=R或dy=R都可以执行一次循环
int x1=x2-R;
int y1=y2-R;
res=Math.max(res,s[x2][y2]-s[x1][y2]-s[x2][y1]+s[x1][y1]);
//因为R是长度,所以要-1,但是可以和公式抵消,公式里的x1和y1都是要-1,所以都不减1就抵消了
}
}
System.out.println(res);
}
}