这是看了白书之后做的第一道树状数组的题目,注意该题的输入是按Y升序排列的,所以在输入某一序列之前的一定在该序列的左边,故Y的值可以不用考虑
而接下来的就是记录X之前小于X的个数,如果用x[i]来表示i是否出现过,则C[X]是用来表示X[x-1] - X[0]的前缀和,C[x]记录了小于x的个数
AC代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int maxn = 32000 + 500;
int c[maxn];
int lev[maxn];
int lowbit(int n){
return n & (-n);
}
int sum(int n){
int k = 0;
while(n > 0){
k += c[n];
n -= lowbit(n);
}
return k;
}
int update(int x){
while(x < maxn){
c[x]++;
x += lowbit(x);
}
return 0;
}
int main(){
int x, y, n;
int i, j, k;
while(scanf("%d", &n) != EOF){
memset(c, 0, sizeof(c));
memset(lev, 0, sizeof(lev));
for(i = 0; i < n; ++i){
scanf("%d%d", &x, &y);
x++;
lev[sum(x)]++;
update(x);
}
for(i = 0; i < n; ++i){
printf("%d\n", lev[i]);
}
}
return 0;
}
还是得发现特性,如果之前不知道这个可以用树状数组解决,还是得多多练习积累经验