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; }