bzoj1218[HNOI2003]激光炸弹

bzoj1218[HNOI2003]激光炸弹

题意:

坐标系上有n个目标,每个目标有一个价值,现在求一个边与坐标轴平行,边长为R的正方形,使在其内部(原题是不包括边界,然而实际上不是这样)的目标价值最大。

题解:

预处理一下以横纵坐标为节点的二维前缀和,然后枚举正方形右上角坐标即可。注意可以将坐标系向右上移动一个单位使前缀和不用考虑负数。反思:蒟蒻好弱啊,枚举时i和j的边界都应该是所以节点横坐标最大值与纵坐标最大值的最大值。蒟蒻一开始没注意到这一点,以为自己预处理写错。改来改去,WA来WA去。最后对着标程一点点改才发现问题。QAQ

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define maxn 5500
 5 #define inc(i,j,k) for(int i=j;i<=k;i++)
 6 using namespace std;
 7 
 8 int sum[maxn][maxn],n,mxxy,r,mx;
 9 int main(){
10     scanf("%d%d",&n,&r); mxxy=mx=0;
11     inc(i,1,n){
12         int x,y,z; scanf("%d%d%d",&x,&y,&z); x++; y++;
13         mxxy=max(mxxy,x); mxxy=max(mxxy,y); sum[x][y]+=z;
14     }
15     inc(i,1,mxxy)inc(j,1,mxxy)
16         sum[i][j]+=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
17     inc(i,r,mxxy)inc(j,r,mxxy)
18         mx=max(mx,sum[i][j]-sum[i][j-r]-sum[i-r][j]+sum[i-r][j-r]);
19     printf("%d",mx); return 0;
20 }

 

20160602

posted @ 2016-07-20 19:12  YuanZiming  阅读(373)  评论(0编辑  收藏  举报