题意
一种新型的激光炸弹,可以摧毁一个边长为R的正方形内的所有的目标。
现在地图上有n(N ≤ 10000)个目标,用整数Xi,Yi(其值在[0,5000])表示目标在地图上的位置,每个目标都有一个价值。
激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆破范围,即那个边长为R的正方形的边必须和x,y轴平行。
若目标位于爆破正方形的边上,该目标将不会被摧毁。
就是找一个边长为R的正方形使得val最大
思路
典型的二维前缀和,如果不清楚什么是二维前缀和可以看一下我之前写的这篇博客里面有详细的二维前缀和解析
代码
#include<bits/stdc++.h> using namespace std; #pragma GCC optimize(2) #pragma GCC optimize(3) typedef long long ll; typedef unsigned long long ull; #define pb push_back #define pll pair<ll,ll> #define INF 0x3f3f3f3f const int mod = 1e9+7; const int maxn = 5e3 + 5; inline ll read(){ ll s = 0, w = 1; char ch = getchar(); while (ch < 48 || ch > 57) { if (ch == '-') w = -1; ch = getchar(); } while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar(); return s * w; } int a[maxn][maxn]; int main() { int n = read(), r = read(); int x, y, v; for (int i = 1; i <= n; ++i) x = read(), y = read(), v = read(), a[x + 1][y + 1] = v; for (int i = 1; i < maxn; ++i) for (int j = 1; j < maxn; ++j) a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1]; int ans = 0; for (int i = r; i < maxn; ++i) for (int j = r; j < maxn; ++j) ans = max(ans, a[i][j] - a[i - r][j] - a[i][j - r] + a[i - r][j - r]); cout<<ans<<endl; return 0; }