题目链接:
POJ 2352 Stars
题意:
每个星星的level是纵坐标小于等于它并且横坐标小于它的星星的数量。按照y从小到大,其次x从小到大的顺序给出n个星星的坐标,输出level从0到n-1的星星的数量。
分析:
由于给出的坐标是优先按照y排序的,那么直接对每个星星查找x的树状数组值然后更新就好了。
//556K 375MS
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn=32100;
int n,x,y;
int bits[maxn],num[maxn];
inline void update(int k)
{
while(k<maxn){
bits[k]++;
k+=(k&(-k));
}
}
inline int sum(int k)
{
int sum=0;
while(k>0){
sum+=bits[k];
k-=(k&(-k));
}
return sum;
}
int main()
{
//freopen("poj2325in.txt","r",stdin);
while(~scanf("%d",&n)){
memset(num,0,sizeof(num));
memset(bits,0,sizeof(bits));
for(int i=0;i<n;i++){
scanf("%d%d",&x,&y);
x++;
int tmp=sum(x);
//printf("i=%d tmp=%d\n",i,tmp);
num[tmp]++;
update(x);
}
for(int i=0;i<n;i++){
printf("%d\n",num[i]);
}
}
return 0;
}