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;
}
还是得发现特性,如果之前不知道这个可以用树状数组解决,还是得多多练习积累经验
而接下来的就是记录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 2352 hdu 2642 hdu 1556 poj 2155 树状数组
- poj 2352 入门树状数组
- POJ 2352 Stars 树状数组
- poj 2352 树状数组(星星的级别)
- POJ_2352_树状数组
- Stars (poj 2352 树状数组)
- POJ 2352 Stars 树状数组
- 树状数组 poj 2352
- poj 2352 Stars 树状数组
- POJ 2352 树状数组
- poj 2352 树状数组
- POJ 2352 Stars 初学树状数组
- POJ 2352 stars 树状数组
- poj 2352 Stars 树状数组
- POJ 2352 Star (树状数组)
- poj 2352 Stars(线段树||树状数组)
- poj_2352树状数组
- POJ 2352 树状数组
- POJ 2352 Stars 树状数组
- 求左下角星星之和 树状数组或线段树 poj 2352 Stars