HDU 1556 Color the ball (树状数组区间更新)

水题,练习一下树状数组实现区间更新。

对于每个区间,区间左端点+1,右端点的后一位-1,查询每个位置的覆盖次数

#include <cstdio>

#include <cstring>



const int MAXN = 100005;



int N, C[MAXN];



int lowbit( int x )

{

    return (-x)&x;

}



void update(int x, int add)

{

    for(int i = x; i <= N; i += lowbit(i))

        C[i] += add;

    return;

}



int sum(int x)

{

    int ret = 0;

    for(int i = x; i > 0; i -= lowbit(i))

        ret += C[i];

    return ret;

}



int main()

{

    while( scanf("%d", &N)== 1 && N )

    {

        memset(C, 0, sizeof(C));

        for(int i = 1; i <= N; i++)

        {

            int a, b;

            scanf("%d%d",&a,&b);

            update(a, 1);

            update(b + 1, -1);

        }



        for(int i = 1; i <= N; i++)

        {

            if ( i > 1 ) putchar(' ');

            printf( "%d", sum(i) );

        }

        puts("");

    }

    return 0;

}

 

你可能感兴趣的:(color)