题目描述
激光炸弹
https://www.acwing.com/problem/content/description/101/
输入样例
2 1
0 0 1
1 1 1
输出样例
1
C++ 代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5010;
int s[N][N];
int r, x, y, w, n;
int main() {
cin >> n >> r;
r = min(5001, r); // 因为r最大可以取 10^9,必要的,不然过不了。
while (n--) {
cin >> x >> y >> w;
s[x+1][y+1] += w;
}
// 计算前缀和
for (int i = 1; i <= 5001; i++) {
for (int j = 1; j <= 5001; j++) {
s[i][j] += s[i-1][j] + s[i][j-1] - s[i-1][j-1];
}
}
/*
其中的i = r, j = r;可很好的取代正方形的四个点(x1,y1,x2,y2),s[i][j] - s[i - r][j] - s[i][j - r] + s[i - r][j - r]中
很好的用两个变量和一个r来表示四个点(x1,y1,x2,y2),美观简化代码。
*/
int ans = 0;
for (int i = r; i <= 5001; i++) {
for (int j = r; j <= 5001; j++) {
ans = max(ans, s[i][j] - s[i - r][j] - s[i][j - r] + s[i - r][j - r]);
}
}
cout << ans << endl; // 输出结果
return 0;
}