题目链接:http://poj.org/problem?id=2352
题意:给出n个星星的坐标,每个星星的等级为纵坐标小于等于它且横坐标小于等于它的星星数,最后按顺序输出等级分别为0至n-1的的星星数。
分析:这题属于树状数组的基础题。
根据观察题目中给出的输入数据的性质就可以发现,在每颗星星的坐标被输入时,
它的等级已经确定(所有满足条件的星星都已经在它之前给出)。
而且它保证了之前的每一颗星星都满足纵坐标的条件,
所以我们只需要统计当前横坐标小于等于Xi的星星个数就可以计算出Stari的等级了,
所以通过使用一个树状数组统计每个横坐标位置上有多少颗星星即可了。
需要注意的是为了使树状数组的下标从一开始,我们在读入之后应该将横坐标+1之后在进行统计。
AC代码如下:
1 #include<stdio.h> 2 #include<string.h> 3 #define N 32010 4 int d[32010],cnt[15010]; 5 int lowbit(int x) 6 { 7 return x&(-x); 8 } 9 int GetSum(int x) 10 { 11 int s=0; 12 while(x>0) 13 { 14 s+=d[x]; 15 x-=lowbit(x); 16 } 17 return s; 18 } 19 void update(int x,int num) 20 { 21 while(x<N) 22 { 23 d[x]+=num; 24 x+=lowbit(x); 25 } 26 } 27 int main() 28 { 29 int n,i,x,y; 30 scanf("%d",&n); 31 memset(d,0,sizeof(d)); 32 memset(cnt,0,sizeof(cnt)); 33 for(i=0;i<n;i++) 34 { 35 scanf("%d%d",&x,&y); 36 cnt[GetSum(x+1)]++; 37 update(x+1,1); 38 } 39 for(i=0;i<n;i++) 40 printf("%d ",cnt[i]); 41 return 0; 42 }