POJ 2352

  这是一道树状数组的基本操作题,熟悉树状数组的更新操作和求和操作。题意是求对一个坐标 (X,Y),求 (x,y)的个数,其中x<=X,y<=Y。由于坐标按照y的升序给出(如果y相同,又按x的升序给出),所以这里只用得着x一个坐标,每得到一组坐标(a,b),就求x坐标小于等于a的星星个数,再将坐标为a的星星个数更新(加1)。

  另外,为防止x=0在lowbit()中造成死循环,每次得到x坐标都应该加1.

#include<stdio.h>
#include<string.h>
#define MAX_STAR 32010 
int n,c[MAX_STAR],level[MAX_STAR];
void update(int,int);
inline int lowbit(int);
int get_sum(int);
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
    int i;
    for(i=0;i<=n;i++)
    {
        level[i]=0;
        c[i]=0;
    }
    for(i=0;i<n;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        x+=1;
        int tmp=get_sum(x);
        level[tmp]++;
        update(x,1);
    }
    for(i=0;i<n;i++)
    {
        printf("%d\n",level[i]);
    }
    }
    return 0;
}
void update(int x,int val)
{
    int i;
    for(i=x;i<MAX_STAR;i+=lowbit(i))
    {
    c[i]+=val;
    }
}
inline int lowbit(int x)
{
    return (x&-x);
}
int get_sum(int x)
{
    int i,sum=0;
    for(i=x;i>0;i-=lowbit(i))
    {
    sum+=c[i];
    }
    return sum;
}
posted @ 2012-08-08 17:23  等待电子的砹  阅读(168)  评论(0)    收藏  举报