这个题主要利用了二维数组的前缀和来求每一个R*R区域内的值。
这里坐标加一处理是为了后面的求前缀和的时候减一操作不至于越界。
还有一点要注意的是f[i][j]表示的是包含边上的目标的值。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#pragma GCC optimize(2)
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=5000;
int f[maxn+5][maxn+5];
int x,y,z,n,r;
int main()
{
while(scanf("%d%d",&n,&r)!=EOF)
{
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&x,&y,&z);
f[x+1][y+1]=z;
}
for(int i=1;i<=5001;i++)
for(int j=1;j<=5001;j++)
f[i][j]+=f[i-1][j]+f[i][j-1]-f[i-1][j-1];
int ans=0;
for(int i=r;i<=5001;i++)
for(int j=r;j<=5001;j++)
ans=max(ans,f[i][j]-f[i-r][j]-f[i][j-r]+f[i-r][j-r]);
printf("%d\n",ans);
}
return 0;
}