传送门
从图片中我们可以看出只需要枚举所有的(r-1)*(r-1)的子矩阵的和再取一下max就行了
直接上代码:
#include<iostream>
using namespace std;
const int N=5e3+10,inf=0x3f3f3f3f;
int s[N][N];
int l1=inf,r1=inf,l2=-inf,r2=-inf;
int main()
{
int n,r;
scanf("%d%d",&n,&r);
while(n--)
{
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
s[x+1][y+1]+=w;
l1=min(l1,x+1),r1=min(r1,y+1);
l2=max(l2,x+1),r2=max(r2,y+1);
}
for(int i=l1;i<=5000;++i)
for(int j=r1;j<=5000;++j)
s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
int ans=-inf;
for(int i=l1;i+r-1<=5000;++i)
for(int j=r1;j+r-1<=5000;++j)
ans=max(ans,s[i+r-1][j+r-1]-s[i-1][j+r-1]-s[i+r-1][j-1]+s[i-1][j-1]);
printf("%d\n",ans);
return 0;
}