POJ 2029 Get Many Persimmon Trees(二维BIT)

Description
给出一个矩形某几个坐标有树,然后给你一个给定的大小的矩形放置到里面,问如何才能让这个矩形里面的树最多
Input
多组用例,每组用例第一行为树的数量n,第二行为矩形的宽w和高h,之后n行每行两个整数表示树的坐标,最后一行两个整数s和t表示小矩形的宽和高,以n=0结束输入
Output
对于每组用例,输出小矩形中树的最大数量
Sample Input
16
10 8
2 2
2 5
2 7
3 3
3 8
4 2
4 5
4 8
6 4
6 7
7 5
7 8
8 1
8 4
9 6
10 3
4 3
8
6 4
1 2
2 1
2 4
3 4
4 2
5 3
6 1
6 2
3 2
0
Sample Output
4
3
Solution
二维BIT
Code

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define maxn 111
int b[maxn][maxn];
int w,h;
int add(int x,int y)
{
    int sum=0;
    for(int i=x;i>0;i-=i&-i)
        for(int j=y;j>0;j-=j&-j)
            sum+=b[i][j];
    return sum;
}
void update(int x,int y)
{
    for(int i=x;i<=w;i+=i&-i)
        for(int j=y;j<=h;j+=j&-j)
            b[i][j]++;
}
int main()
{
    int n;
    while(scanf("%d",&n),n)
    {
        memset(b,0,sizeof(b));
        scanf("%d%d",&w,&h);
        for(int i=0;i<n;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            update(x,y);
        }
        int s,t;
        scanf("%d%d",&s,&t);
        int ans=-1;
        for(int i=s;i<=w;i++)
            for(int j=t;j<=h;j++)
                ans=max(ans,add(i,j)+add(i-s,j-t)-add(i-s,j)-add(i,j-t));
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(POJ 2029 Get Many Persimmon Trees(二维BIT))