题意:就是要在一个w*h的矩形中找到一个s*t的矩形使其中包含的*最多。
二维和一维树状数组的区别啊,就只是参数多了一维,循环变成二重循环。
然后那个矩形面积就像概率论里学的那个公式一样= =
给个小媛姐画的图哈哈~~~~
#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 110
using namespace std;
int c[maxn][maxn],w,h;
int Lowbit(int x)
{
return x&(x^(x-1));
}
int Getsum(int x,int y)
{
int ret = 0;
for(int i=x;i>0;i-=Lowbit(i))
{
for(int j=y;j>0;j-=Lowbit(j))
ret+=c[i][j];
}
return ret;
}
void update(int x,int y)
{
for(int i=x;i<=w;i+=Lowbit(i))
{
for(int j=y;j<=h;j+=Lowbit(j))
c[i][j]++;
}
}
int main()
{
int n,s,t,x,y;
while(scanf("%d",&n)!=EOF && n)
{
memset(c,0,sizeof(c));
scanf("%d%d",&w,&h);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
update(x,y);
}
scanf("%d%d",&s,&t);
int ans = 0,res;
for(int i=s;i<=w;i++)
{
for(int j=t;j<=h;j++)
{
res = Getsum(i,j)-Getsum(i-s,j)-Getsum(i,j-t)+Getsum(i-s,j-t);
if(res>ans)
ans = res;
}
}
printf("%d\n",ans);
}
return 0;
}
这题也可以暴力诶= =,100的范围,O(N^4)居然能过呀~~~~~~~10^8诶!!
而且都是16ms
#include<cstdio>
#include<iostream>
#include<cstring>
#define maxn 110
using namespace std;
int mp[maxn][maxn];
int main()
{
int n,w,h,x,y,s,t;
while(~scanf("%d",&n) && n)
{
memset(mp,0,sizeof(mp));
scanf("%d%d",&w,&h);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
mp[x][y] = 1;
}
scanf("%d%d",&s,&t);
int ans = 0;
for(int i=1;i+s-1<=w;i++)
{
for(int j=1;j+t-1<=h;j++)
{
int cnt = 0;
for(int k=i;k<i+s;k++)
{
for(int l=j;l<j+t;l++)
if(mp[k][l]) cnt++;
}
ans = max(ans,cnt);
}
}
printf("%d\n",ans);
}
return 0;
}