题意:在二维平面上有n个星星。每个星星有一个坐标。星星的级别定位为其左方和下方的星星数量之和。输入按照y坐标递增,y相同的按照x递增。分别输出级别为0-n-1的星星的数量
思路:树状数组。根据输入的规则,对于当前星星,只需计算之前输入的星星中在其左侧和下侧的星星之和。
#include <stdio.h>
#include <string.h>
#define N 32005
int n;
int tree[N],res[N];
int lowbit(int x){
return x&(-x);
}
int sum(int x){
int num = 0;
while(x){
num += tree[x];
x -= lowbit(x);
}
return num;
}
void update(int x){
while(x<N){
tree[x]++;
x += lowbit(x);
}
}
int main(){
int i,a,b;
freopen("a.txt","r",stdin);
memset(tree,0,sizeof(tree));
memset(res,0,sizeof(res));
scanf("%d",&n);
for(i = 0;i<n;i++){
scanf("%d %d",&a,&b);
res[sum(a+1)]++;
update(a+1);
}
for(i = 0;i<n;i++)
printf("%d\n",res[i]);
return 0;
}