解题思路:
给予 n 个点,和爆炸范围 R,我们能炸 R * R 个点,利用前缀和,首先预处理出前缀和,然后再对每一块 R * R 区域进行计算 ,求出最大值。
(理解好炸的范围,以及处理好坐标的右下端点)
#include <cstdio>
#include <iostream>
using namespace std;
const int N = 5010;
int n , R , s[N][N];
int main(){
scanf("%d%d",&n,&R);
R = min (R , 5001); // 最大是5001,因为我们从1开始,不是从0开始
int l = R;
int r = R;
int x, y , w;
for (int i = 0; i < n ; i++){
scanf("%d%d%d",&x,&y,&w);
s[x + 1][y + 1] += w;
l = max(l, x + 1); // 计算x,y的最大值
r = max(r, y + 1);
}
for (int i = 1; i <= l; i++){ // 处理前缀和
for (int j = 1; j <= r; j ++){
s[i][j] += s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
}
}
int res = 0;
for (int i = R; i <= l ; i++){ //对每一块R * R区域进行计算
for (int j = R ; j <= r; j++){
res = max(res, s[i][j] - s[i - R][j] - s[i][j - R] + s[i - R][j - R]);
}
}
printf("%d\n",res);
return 0;
}