EG1 激光炸弹 题意:给你n个点的坐标及权值,用r * r的范围最大覆盖是多少 题解 //二维的 前缀和 问题 #include <iostream> #include <algorithm> using namespace std; int n, r; int ta, tb; int x, y, w; int sum[5005][5005]; int ans = 0; int main() { cin >> n >> r; // r 为 正方形的范围 ta = r; tb = r; for (int i = 0; i < n; i++) //首先利用 for 循环 扫一遍算出每个点的权值 // sum[i][j]表示从(1,1)到(i,j)里所含的总值 { cin >> x >> y >> w; x++; y++; sum[x][y] += w; ta = max(ta, x); tb = max(tb, y); } for (int i = 1; i <= ta; i++) for (int j = 1; j <= tb; j++) sum[i][j] += sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1]; for (int i = r; i <= ta; i++) for (int j = r; j <= tb; j++) ans = max(ans, sum[i][j] - sum[i - r][j] - sum[i][j - r] + sum[i - r][j - r]); // 相当于求以i,j分开的四个矩形中的右上方的矩形 cout << ans << endl; return 0; }