[HNOI2003]激光炸弹
二维前缀和问题
- 每一个点用格子代替
- 求(0,0)到(i,j)之间的前缀和 :f[i][j]+=f[i-1][j]+f[i][j-1]-f[i-1][j-1];
- 计算每一个格子的价值:ans=max(ans,f[i][j]-f[i-R][j]-f[i][j-R]+f[i-R][j-R]);
#include<bits/stdc++.h>
using namespace std;
#define maxn 5050
#define inf 0x3f3f3f3f
#define mm(a,x) memset(a,x,sizeof(a))
#define ll long long
int f[maxn][maxn];
int main() {
int n,R,x,y,v;cin>>n>>R;
int xx=R,yy=R;
for(int i=1;i<=n;i++){
cin>>x>>y>>v;x++,y++;
f[x][y]=v;
xx=max(xx,x);
yy=max(yy,y);
}
for(int i=1;i<=xx;i++)
for(int j=1;j<=yy;j++)
f[i][j]+=f[i-1][j]+f[i][j-1]-f[i-1][j-1];
int ans=0;
for(int i=R;i<=xx;i++)
for(int j=R;j<=yy;j++)
ans=max(ans,f[i][j]-f[i-R][j]-f[i][j-R]+f[i-R][j-R]);
cout<<ans<<"
";
return 0;
}