您的位置:首页 > 其它

POJ_2352 树状数组

2015-03-23 17:17 267 查看
这是看了白书之后做的第一道树状数组的题目,注意该题的输入是按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 -= 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;
}

还是得发现特性,如果之前不知道这个可以用树状数组解决,还是得多多练习积累经验
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  树状数组 poj