题目大意:
给你K个柿子坐标,m*n的土地,问你取s*t的土地,最大可以取到多少个柿子
解题思路:
枚举所有可能的结束位置,然后通过树状数组算出矩形中的和即可;
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 110
int c[maxn][maxn];
int m,n;
int lowbit(int x)
{
return x&(-x);
}
void updata(int x,int y)
{
for(int i=x;i<=m;i+=lowbit(i))
for(int j=y;j<=n;j+=lowbit(j))
c[i][j]+=1;
}
int sum(int x,int y)
{
int ans=0;
for(int i=x;i>0;i-=lowbit(i))
for(int j=y;j>0;j-=lowbit(j))
ans+=c[i][j];
return ans;
}
int main()
{
int k;
//freopen("input.txt","r",stdin);
while(scanf("%d",&k),k)
{
memset(c,0,sizeof(c));
scanf("%d%d",&m,&n);
for(int i=0;i<k;i++)
{
int a,b;
scanf("%d%d",&a,&b);
updata(a,b);
}
int s,t;
scanf("%d%d",&s,&t);
int ans=0;
for(int i=s;i<=m;i++)
{
for(int j=t;j<=n;j++)
{
int cur=sum(i,j)-sum(i,j-t)-sum(i-s,j)+sum(i-s,j-t);
ans=max(cur,ans);
}
}
printf("%d\n",ans);
}
}