二维前缀和模板题:https://ac.nowcoder.com/acm/contest/20960/1024
#include<bits/stdc++.h>
using namespace std;
int v[5010][5010];
int n,r;
int maxx=0,maxy=0;
int main(){
int ans=0;
scanf("%d%d",&n,&r);
for(int i=0;i<n;i++){
int x,y,vv;
scanf("%d%d%d",&x,&y,&vv);
x++,y++; //为方便处理,把所有点往右上平移一个单位
v[x][y]=vv;
maxx=max(maxx,x);
maxy=max(maxy,y);
}
maxx=max(maxx,r);
maxy=max(maxy,r);
for(int i=1;i<=maxx+1;i++){ //构造二维前缀和模板
for(int j=1;j<=maxy+1;j++){
v[i][j]+=v[i-1][j]+v[i][j-1]-v[i-1][j-1]; //方便处理
}
}
for(int i=r;i<=maxx;i++){ //求某区间前缀和模板
for(int j=r;j<=maxy;j++){
ans=max(ans,v[i][j]-v[i][j-r]-v[i-r][j]+v[i][j]);
}
}
cout<<ans;
return 0;
}