题目链接
思路:二维前缀和+内存优化(题目10^8需要优化),所以用n,m记录大的那个前缀和
前缀和的计算: f[i][j]=f[i−1][j]+f[i][j−1]−f[i−1][j−1]+a[i][j]
边长为r的正方形前缀和计算:a[i][j]-a[i-r][j]-a[i][j-r]+a[i-r][j-r]
技巧:因为前缀和从1开始比较方便,所以处理数据时x++,y++
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <vector>
#include <map>
#include <stack>
#include <queue>
using namespace std;
typedef long long ll;
const int MAX=0x3f3f3f3f;
const int N=5010;
int a[N][N];
int main(){
int N,r;
cin>>N>>r;
int n=r,m=r;
for(int i=0;i<N;i++){
int x,y,w;
cin>>x>>y>>w;
x++,y++;
n=max(n,x),m=max(m,y);
a[x][y]+=w;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
}
}
int res=0;
for(int i=r;i<=n;i++){
for(int j=r;j<=m;j++){
res=max(res,a[i][j]-a[i-r][j]-a[i][j-r]+a[i-r][j-r]);
}
}
cout<<res<<endl;
}