题意:
一种新型的激光炸弹,可以摧毁一个边长为R的正方形内的所有的目标。
现在地图上有n(N ≤ 10000)个目标,用整数Xi,Yi(其值在[0,5000])表示目标在地图上的位置,每个目标都有一个价值。
激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆破范围,即那个边长为R的正方形的边必须和x,y轴平行。
若目标位于爆破正方形的边上,该目标将不会被摧毁。
就是找一个边长为R的正方形使得val最大
思路:二维前缀和板子题
1.出于习惯,可以把目标范围改为
2.维护二维前缀和,表示式为:
3.要价值最大,则正方形的可以取价值的面积最大是
3.枚举每个正方形,取最大值,取每个正方形价值的表达式为:,其实就是左上角点和右下角点形成正方形的价值。
Code:

#include<bits/stdc++.h>
#define  js  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
const int maxn = 5e3 + 5;
int a[maxn][maxn],ans;
int main() {
    js; int n,r,x,y,val;
    cin>>n>>r;
    for(int i=1;i<=n;++i) {
        cin>>x>>y>>val;
        a[x+1][y+1]=val;
    }
    for (int i = 1; i < maxn; ++i)
    for (int j = 1; j < maxn; ++j)
        a[i][j]=a[i][j]+a[i - 1][j]+a[i][j - 1]-a[i - 1][j - 1];
    for(int i=r;i<maxn;++i)
    for(int j=r;j<maxn;++j)
        ans=max(ans,a[i][j]-a[i][j-r]-a[i-r][j]+a[i-r][j-r]);
    cout<<ans<<"\n";
    return 0;
}