题解 P2280 [HNOI2003]激光炸弹
do_while_true · · 题解
upd: 增加了一点点解释 =w=
首先把问题化简一下,如果是一条线的话应该怎么办。
考虑到一个长度为
也就是我们把这个投放的线段的两端放在不是整点数的位置,就能让一个长度为
如图所示:
图画的有点丑
也就是说这个激光炸弹的投放的正方形的四个角不一定非得落在坐标轴的整数点位置,而是把这四个角放在格子的内部,这样恰好能覆盖到
于是问题转化成了一个矩阵中大小为
因为在题目中
值得注意的是,如果选择按原坐标
Code
#include<iostream>
#include<cstdio>
using namespace std;
int sum[5002][5002],n,m,x,y,v,ans;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&x,&y,&v);
sum[x+1][y+1]+=v;
}
for(int i=1;i<=5001;i++)
for(int j=1;j<=5001;j++)
sum[i][j]+=sum[i][j-1]-sum[i-1][j-1]+sum[i-1][j];
for(int i=m;i<=5001;i++)
for(int j=m;j<=5001;j++)
ans=max(ans,sum[i][j]-sum[i][j-m]-sum[i-m][j]+sum[i-m][j-m]);
printf("%d",ans);
return 0;
}