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