#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=5010;
int n,m;//地图总大小
int s[N][N];//预处理作用,多开一个存质量w的话会超限
int main()
{
int cnt,r;
cin>>cnt>>r;
r=min(5001,r);
n=m=r;//设成正方形的话会避免有的点不被遍历
while(cnt--)
{
int x,y,w;
cin>>x>>y>>w;
x++;//把坐标往右下移,可以避免s[-1][-1]的情况
y++;
s[x][y]+=w;//存下点的质量
n=max(n,x);
m=max(m,y);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;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 i=r;i<=n;i++)
{
for(int j=r;j<=m;j++)
{//思路是大正方形(前缀和)-两个小长方形(行列为R),加上原点开始的小正方形(边长r)
res=max(res,s[i][j]-s[i-r][j]-s[i][j-r]+s[i-r][j-r]);
}//看成是用前缀和求正方形里的总和
}
cout<<res<<endl;
return 0;
}
激光炸弹(前缀和)
于 2022-03-05 21:15:24 首次发布
1168

被折叠的 条评论
为什么被折叠?



