99.激光炸弹
思路
前缀和一般可以用在某些求和类的问题上,特别是对于二维数组的求和,一般可以想到使用前缀和来求。
本题思路:
- 要去找一个 的子矩阵里面的和是很困难的,所以通过前缀和优化查找子矩阵的时间, 就可以查找到对应的子矩阵。炸弹的范围本质上就是子矩阵的范围。
 - 实际上就是用一个 的子矩阵扫描,找到这个范围内数值最大的数。
 
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 5e3 + 10;
int n, r;
int g[N][N];
int main() {
    int cnt;
    cin >> cnt >> r;
    r = min(5001, r);
    
    int n = r, m = r;
    for (int i = 0; i < cnt; i++) {
        int x, y, w;
        cin >> x >> y >> w;
        x++, y++;
        n = max(n, x), m = max(m, y);
        g[x][y] += w;
    }
    
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            g[i][j] += g[i][j - 1] + g[i - 1][j] - g[i - 1][j - 1];
    
    int res = 0;
    for (int i = r; i <= n; i++) {
        for (int j = r; j <= m; j++) {
            res = max(res, g[i][j] - g[i - r][j] - g[i][j - r] + g[i - r][j - r]);
        }
    }
    cout << res << endl;
    
    return 0;
}