将前缀和扩展到二维数组:

计算炸弹覆盖范围内的目标价值:
r*r范围 = 右下角点处的前缀和 - 多出部分的前缀和 + 重复减掉的部分
#include<iostream>
using namespace std;

//若目标位于爆破正方形的边上,该目标将不会被摧毁。 
//边长为r的正方形,最多可以摧毁r*r个点

//思想:将前缀和扩展到二维
int map[5010][5010];    //最大地图范围
int main(){
    int n, r;
    cin >> n >> r;
    //记录边界值,初始化为最小值r
    int x_boundary = r;    
    int y_boundary = r;
    for(int i = 0, x, y, v; i < n; i++){
        cin >> x >> y >> v;
        map[++x][++y] = v;    //x与y的边界从0开始,所以记录时应将其+1操作
        x_boundary = max(x_boundary, x);
        y_boundary = max(y_boundary, y);
    }
    //计算前缀和,map[i][j]表示0~i行,0~j列所有元素的和
    for(int i = 1; i <= x_boundary; i++){
        for(int j = 1; j <= y_boundary; j++){
            map[i][j] = map[i-1][j] + map[i][j-1] - map[i-1][j-1] + map[i][j];
        }
    }
    int cnt = 0;    //r*r区域内的和
    for(int i = r; i <= x_boundary; i++){
        for(int j = r; j <= y_boundary; j++){
            cnt = max(cnt, map[i][j] - map[i-r][j] - map[i][j-r] + map[i-r][j-r]);
        }
    }
    cout << cnt <<endl;
    return 0;
}