本文共 1425 字,大约阅读时间需要 4 分钟。
问一个矩形框在一个大矩形内最多能围几个给定的点
都不用排序,先把所有的点加入树状数组,再直接枚举大矩形的每个格子即可
#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define lson 2*i#define rson 2*i+1#define LS l,mid,lson#define RS mid+1,r,rson#define UP(i,x,y) for(i=x;i<=y;i++)#define DOWN(i,x,y) for(i=x;i>=y;i--)#define MEM(a,x) memset(a,x,sizeof(a))#define W(a) while(a)#define gcd(a,b) __gcd(a,b)#define LL long long#define N 1005#define INF 0x3f3f3f3f#define EXP 1e-8#define lowbit(x) (x&-x)const int mod = 1e9+7; int c[N][N],n,m,cnt,s,t; int sum(int x,int y){ int ret = 0; int i,j; for(i = x;i>=1;i-=lowbit(i)) { for(j = y;j>=1;j-=lowbit(j)) { ret+=c[i][j]; } } return ret;} void add(int x,int y,int d){ int i,j; for(i = x;i<=n;i+=lowbit(i)) { for(j = y;j<=m;j+=lowbit(j)) { c[i][j]+=d; } }} int main(){ int i,j,x,y,ans; while(~scanf("%d",&cnt),cnt) { ans = 0; scanf("%d%d",&n,&m); MEM(c,0); for(i = 1;i<=cnt;i++) { scanf("%d%d",&x,&y); add(x,y,1); } scanf("%d%d",&s,&t); for(i = 1;i<=n;i++) { for(j = 1;j<=m;j++) { int x1 = i,y1 = j,x2 = x1+s-1,y2 = y1+t-1; if(x2>n || y2>m) continue; int s = sum(x2,y2)+sum(x1-1,y1-1)-sum(x2,y1-1)-sum(x1-1,y2); ans = max(ans,s); } } printf("%d\n",ans); } return 0;}
转载于:https://www.cnblogs.com/zsben991126/p/10083637.html