因为在边上的点不算,所以可以把一个点扩成一个小正方形。点在正方形中心,相当于对小正方形求前缀和,这样就不会算上边上的点了。
#include<bits/stdc++.h>
using namespace std;
const int nn=5010;
int n,r;
int f[nn][nn];
int ans=0;
inline int read()
{
int x=0,f=1; char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int main()
{
n=read(); r=read();
for(int i=1;i<=n;++i)
{
int a=read();
int b=read();
int c=read();
f[a+1][b+1]=c;//因为在求二维矩阵前缀和中的操作是从1开始的
}
for(int i=1;i<=5002;++i)//5001是该题中最大的边界
for(int j=1;j<=5002;++j)
f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+f[i][j];
for(int i=r;i<=5002;++i)
for(int j=r;j<=5002;++j)
ans=max(ans,f[i][j]+f[i-r][j-r]-f[i-r][j]-f[i][j-r]);
cout<<ans<<endl;
return 0;
}