思路
注意一下多个目标可能在一个点,所以w[x][y]+=ww即可,求一下二位前缀和,然后用容斥定理一个一个枚举可以轰炸的位置,然后输出最大值即可
代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 5010;
int w[N][N];
int n,r;
int main()
{
cin>>n>>r;
for(int i=1;i<=n;i++)
{
int x,y,ww;
cin>>x>>y>>ww;
w[x+1][y+1]+=ww;
}
for(int i=1;i<=5001;i++)
{
for(int j=1;j<=5001;j++)
{
w[i][j]=w[i][j]+w[i-1][j]+w[i][j-1]-w[i-1][j-1];
}
}
if(r>5001)
{
cout<<w[5001][5001];
return 0;
}
int maxx=-1;
for(int i=1;i<=5001-r+1;i++)
{
for(int j=1;j<=5001-r+1;j++)
{
maxx=max(maxx,w[i+r-1][j+r-1]-w[i-1][j+r-1]-w[i+r-1][j-1]+w[i-1][j-1]);
}
}
cout<<maxx;
return 0;
}