P2280 [HNOI2003]激光炸弹
由于正方形边上的目标不会摧毁,所以如果按照左图的形式来投放炸弹,实际只能摧毁\((R-1)\times(R-1)\)个点,但如果按照右图的形式来投放炸弹,则能摧毁\(R\times R\)个目标,题目要求摧毁总价值最大的边长为\(R\)的正方型区域,显然按右图的形式来计算。
采用二维前缀和计算。
const int N=5010;
int s[N][N];
int n,m;
int main()
{
int T,r;
cin>>T>>r;
n=m=r;
while(T--)
{
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
x++,y++;
n=max(x,n),m=max(m,y);
s[x][y]+=w;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
int res=0;
for(int i=r;i<=n;i++)
for(int j=r;j<=m;j++)
res=max(res,s[i][j]-s[i-r][j]-s[i][j-r]+s[i-r][j-r]);
printf("%d\n",res);
return 0;
}