A.激光炸弹
1 //二维的 前缀和 问题 2 #include <iostream> 3 #include <algorithm> 4 5 using namespace std; 6 7 int n, r; 8 int ta, tb; 9 int x, y, w; 10 int sum[5005][5005]; 11 int ans = 0; 12 int main() 13 { 14 cin >> n >> r; // r 为 正方形的范围 15 ta = r; 16 tb = r; 17 for (int i = 0; i < n; i++) //首先利用 for 循环 扫一遍算出每个点的权值 18 // sum[i][j]表示从(1,1)到(i,j)里所含的总值 19 { 20 cin >> x >> y >> w; 21 x++; 22 y++; 23 sum[x][y] += w; 24 ta = max(ta, x); 25 tb = max(tb, y); 26 } 27 for (int i = 1; i <= ta; i++) 28 for (int j = 1; j <= tb; j++) 29 sum[i][j] += sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1]; 30 for (int i = r; i <= ta; i++) 31 for (int j = r; j <= tb; j++) 32 ans = max(ans, sum[i][j] - sum[i - r][j] - sum[i][j - r] + sum[i - r][j - r]); // 相当于求以i,j分开的四个矩形中的右上方的矩形 33 cout << ans << endl; 34 return 0; 35 }