hdu-1556 Color the ball---树状数组+区间修改单点查询
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1556
题目大意:
Problem Description
N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色。但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗?
Input
每个测试实例第一行为一个整数N,(N <= 100000).接下来的N行,每行包括2个整数a b(1 <= a <= b <= N)。
当N = 0,输入结束。
当N = 0,输入结束。
Output
每个测试实例输出一行,包括N个整数,第I个数代表第I个气球总共被涂色的次数。
解题思路:
裸的树状数组,但是是区间修改单点更新
1 #include<iostream> 2 #include<algorithm> 3 #include<set> 4 #include<cstring> 5 #include<cstdio> 6 using namespace std; 7 const int maxn = 100000 + 10; 8 typedef long long ll; 9 int tree[maxn]; 10 int n; 11 int lowbit(int x) 12 { 13 return x & (-x); 14 } 15 //求第x个数字 16 int sum(int x) 17 { 18 int ret = 0; 19 while(x <= n) 20 { 21 ret += tree[x]; 22 x += lowbit(x); 23 } 24 return ret; 25 } 26 //在区间[1, x]加上d 27 void add(int x, int d) 28 { 29 while(x > 0) 30 { 31 tree[x] += d; 32 x -= lowbit(x); 33 } 34 } 35 int main() 36 { 37 while(scanf("%d", &n) && n) 38 { 39 int x, y; 40 memset(tree, 0, sizeof(tree)); 41 for(int i = 1; i <= n; i++) 42 { 43 scanf("%d%d", &x, &y); 44 add(y, 1); 45 add(x - 1, -1); 46 } 47 for(int i = 1; i <= n; i++) 48 { 49 int x = sum(i); 50 printf("%d", x); 51 if(i == n)printf("\n"); 52 else printf(" "); 53 } 54 } 55 return 0; 56 }
越努力,越幸运