题意:星星的等级计算方法是看它左下方星星的数目来定的。根据y坐标递增(若y坐标相等则x坐标递增)的顺序给出一堆星星的坐标,请计算所有等级(n-1个等级)的星星数。
解题思路:由于是按一定顺序给出星星,那么我们读进的星星不会有前者等级大于后者的情况出现。情况只有两种:①前者在后者的左下方;②前者不在后者的左下方。
每一次读进星星我们只能靠x来判断是属于那种情况,所以如果有一个表可以记录横坐标为
0--x的星星数目的话,这个题目就相当简单了,而这个表就是树状数组。
31msC++代码
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cmath> using namespace std; const int NUM = 40000<<2; int cc[ NUM ]; int nn; int lowbit(int i)//寻找过程? { return i&(-i); } void update(int i,int num)//更新,把1--i的所有值都加上 //mun!! { while(i>0 && i<=NUM)//将0的情况完全排除,其中nn是记录的数据的上限 { cc[i]=cc[i]+num;//其中cc是上传记录的数组 i=i+lowbit(i); } } int sum(int i)//查询1--i的和? { int t=0; while(i>0&& i<=NUM) { t=t+cc[i]; i=i-lowbit(i); } return t; } int ans[40000]; void init() { memset(cc, 0, sizeof(cc)); memset(ans,0, sizeof(ans)); } int main() { int i,j,x,y; while(scanf("%d",&nn)!=EOF) { init(); for(i = 0; i<nn ;i++) { scanf("%d %d",&x,&y); ans[sum(x+1)]++; update(x+1,1); } for(i = 0; i<nn ;i++) printf("%d\n",ans[ i ]); } return 0; }