AcWing 99. 激光炸弹
原题链接
简单
作者:
乡村守望者
,
2020-02-17 13:32:35
,
所有人可见
,
阅读 731
//用到了前缀和 故 坐标+1 所以最大为5001
//r最大也是5001,再大其实和5001是一样的
//这里可以把每一个目标当做 方格的中心
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 5012;
int a[N][N];
int n,r;
int main()
{
scanf("%d%d",&n,&r);
int row=0,col=0;
r = min(5001,r);
while(n--)
{
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
//坐标需要增大
x++;
y++;
//不同目标可能在同一位置
a[x][y]+=c;
//这里处理最大row,col是无用的
//因为把5001 换成 row,col之后 可能根本就无法进入处理一遍 那里
row = max(x,row);
col = max(y,col);
}
//求前缀和数组
for(int i=1;i<=5001;++i){
for(int j=1;j<=5001;++j){
a[i][j]+=a[i][j-1]+a[i-1][j]-a[i-1][j-1];
}
}
int ans = 0;
//处理一遍寻求答案
for(int i=r;i<=5001;++i){
for(int j=r;j<=5001;++j){
ans=max(ans,a[i][j]-a[i-r][j]-a[i][j-r]+a[i-r][j-r]);
}
}
printf("%d",ans);
return 0;
}