您的位置:首页 > 其它

[HDOJ1556]Color the ball

2015-09-01 17:35 316 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556

树状数组的第二类应用:区间更新。需要做的是将update函数修改为由a更新到n+权值即可,然后更新b到n-权值就可以实现固定区间的更新。

代码如下:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <queue>
#include <map>
#include <stack>
#include <list>
#include <vector>

using namespace std;

const int maxn = 100010;
int d[maxn<<1];
int n, a, b;

//求某点管辖范围
int lowbit(int x) { //求x末尾最低位1的位置(末尾0的个数+1)
// return x & (x ^ (x - 1));
return x & (-x);
}

//更新树状数组(i到x)
void update(int i, int x, int num) {
while(i <= x) {
d[i] += num;
i += lowbit(i);
}
}

//获取前x项和
int getsum(int x) {
int sum = 0;
while(x > 0) {
sum += d[x];
x -= lowbit(x);
}
return sum;
}

int main() {
// freopen("in", "r", stdin);
while(~scanf("%d", &n) && n) {
memset(d, 0, sizeof(d));
for(int i = 1; i <= n; i++) {
scanf("%d %d", &a, &b);
update(a, n, 1);
update(b+1, n, -1);
}
for(int i = 1; i <= n; i++) {
int ans;
if(i == 1) {
printf("%d", d[i]);
}
else {
printf("%d", getsum(i));
}
if(i != n) {
printf(" ");
}
else {
printf("\n");
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: