问一个矩形框在一个大矩形内最多能围几个给定的点
都不用排序,先把所有的点加入树状数组,再直接枚举大矩形的每个格子即可
#include <iostream> #include <stdio.h> #include <string.h> #include <string> #include <stack> #include <queue> #include <map> #include <set> #include <vector> #include <math.h> #include <bitset> #include <list> #include <algorithm> #include <climits> 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 ",ans); } return 0; }