您的位置:首页 > 其它

poj 2029 Get Many Persimmon Trees

2015-08-13 22:41 411 查看
题意:美丽的夜晚有许多的星星,每个星星都有自己的坐标,你有一个长宽确定的窗户,问如何安置窗户可以看到最多的星星的数量,

思路:之前只学了一维的树状数组,想这个题的时候竟然自己yy出了二维的用法,这里我将每一竖行用树状数组储存星星的个数,如a[i][j]代表第i列前1~j行的星星数量,形成一个二维的树状数组,计算最大的星星数量时,枚举窗户位置,利用树状数组的查询功能快速计算出可以看到星星的数量,

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[120][120];
int n,w,h,s,t;
int low(int x)
{
return x&(-x);
}
int que(int x,int y)
{
int tmp=y;
int sum=0;
while(tmp>0)
{
sum+=a[x][tmp];
tmp-=low(tmp);
}
return sum;
}

int add(int x,int y)
{
int tmp=y;
while(tmp<110)
{
a[x][tmp]+=1;
tmp+=low(tmp);
}
return 1;
}
int main()
{
freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF&&n)
{
memset(a,0,sizeof(a));
scanf("%d%d",&w,&h);
int x,y;
for(int i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
}
scanf("%d%d",&s,&t);
int ans=0,sum=0;
for(int i=1;i+s-1<=w;i++)
{
for(int j=1;j+t-1<=h;j++)
{
sum=0;
for(int k=i;k<=i+s-1;k++)
{
sum+=(que(k,j+t-1)-que(k,j-1));
}
ans=max(ans,sum);
}
}
printf("%d\n",ans);

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: