<题目链接>
题目大意:
给你一个H*W的矩阵,再告诉你有n个坐标有点,问你一个w*h的小矩阵最多能够包括多少个点。
解题分析:
二维树状数组模板题。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int M =+;
int tr[M][M];
int n,W,H,w,h;
int lowbit(int x){return x&(-x);}
void add(int x,int y,int val){
for(int i = x;i <= H;i += lowbit(i)){
for(int j = y;j <= W;j += lowbit(j)){
tr[i][j] += val;
}
}
}
int sum(int x,int y){
int ans = ;
for(int i = x;i > ;i -= lowbit(i)){
for(int j = y;j > ;j -= lowbit(j)){
ans += tr[i][j];
}
}
return ans;
}
int main(){
while(scanf("%d",&n)!=EOF,n){
memset(tr,,sizeof(tr));
scanf("%d%d",&H,&W);
for(int i=;i<=n;i++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y,);
}
scanf("%d%d",&h,&w);
int ans=-;
for(int i=h;i<=H;i++){
for(int j=w;j<=W;j++){
int res=sum(i,j)-sum(i-h,j)-sum(i,j-w)+sum(i-h,j-w); //sum(x,y)代表(1,1)到(x,y)这个矩阵包含多少个点
ans=max(ans,res);
}
}
printf("%d\n",ans);
}
return ;
}
2018-10-17