【Bzoj1218】激光炸弹

来源:互联网 发布:sql 查询月份 编辑:程序博客网 时间:2024/05/20 04:50

题意

给你n个点的坐标xi,yi。求一个边长为k的正方形能覆盖多少点。


解析

可以枚举。但是要加一个二维前缀和。统计的时候可以画一个图。首先a[i][j]是一个大矩形。之后在旁边切掉两个小矩形,但多切掉了一个重复部分,要把它加上。


#include <cstdio>#include <algorithm>#define Rep( i , _begin , _end ) for(int i=(_begin);i<=(_end);i++)#define For( i , _begin , _end ) for(int i=(_begin);i!=(_end);i++)using std :: max;using std :: min;const int maxx = 5000 + 25;int x[maxx<<1],y[maxx<<1],v[maxx<<1];int a[maxx][maxx];int n,k,ans;int main(){    scanf("%d%d",&n,&k);    Rep( i , 1 , n ) scanf("%d%d%d",&x[i],&y[i],&v[i]),x[i]++,y[i]++,a[x[i]][y[i]] += v[i];    Rep( i , 1 , 5001 ) Rep( j , 1 , 5001 ) a[i][j] += a[i-1][j];    Rep( i , 1 , 5001 ) Rep( j , 1 , 5001 ) a[i][j] += a[i][j-1];    Rep( i , k , 5001 ) Rep( j , k , 5001 ) ans = max(ans , a[i][j] + a[i-k][j-k] - a[i][j-k] - a[i-k][j]);    printf("%d",ans);}
1 0
原创粉丝点击