Color the ball (hdu 1556 树状数组)

来源:互联网 发布:公司资料保密软件 编辑:程序博客网 时间:2024/06/03 20:40

Color the ball

Time Limit : 9000/3000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 25   Accepted Submission(s) : 15
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,输入结束。
 

Output
每个测试实例输出一行,包括N个整数,第I个数代表第I个气球总共被涂色的次数。
 

Sample Input
31 12 23 331 11 21 30
 

Sample Output
1 1 13 2 1
 


//思路:树状数组模板+巧妙思路


#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <cmath>#include <algorithm>using namespace std;const int MAX = 100100;int n;int a[MAX], c[MAX];int lowbit(int x){return x&(-x);}void add(int k, int x){while (k <= n){c[k] += x;k += lowbit(k);}}int sum(int x){int sum = 0;while (x > 0){sum += c[x];x -= lowbit(x);}return sum;}int main(){int i;while (scanf("%d", &n), n){int x, y;memset(a, 0, sizeof(a));memset(c, 0, sizeof(c));for (i = 1; i <= n; i++){scanf("%d%d", &x, &y);add(x, 1);add(y + 1, -1);}for (i = 1; i < n; i++){printf("%d ", sum(i));}printf("%d\n", sum(n));}return 0;}



原创粉丝点击