有一些点,某个点的 level 被定义为在它左下的点的个数,问各 level 各有多少点。
由于输入时 y 坐标是增序来的,所以可以忽略 y,用一个树状数组 c [ x ] ,来表示目前在坐标 x 以左的点的个数。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int c[40000];
int lowBit(int x){
return x & (-x);
}
void update(int x){
while(x < 40000){
c[x]++;
x += lowBit(x);
}
}
int getSum(int x){
int sum = 0;
while(x > 0){
sum += c[x];
x -= lowBit(x);
}
return sum;
}
int main(){
int N;
int lvl[40000];
cin >> N;
memset(lvl, 0, sizeof(lvl));
for(int i = 0; i < N; i++){
int x, y;
scanf("%d%d", &x, &y);
x++;
lvl[getSum(x)]++;
update(x);
}
for(int i = 0; i < N; i++){
printf("%d\n", lvl[i]);
}
}