HDU1556 - Color the ball

题目大意

给定区间[1,N],初始时区间的每个数都是0,对其进行多次操作,每次给出两个数a和b,要求你对在区间[a,b]的数全部加1,在操作结束后输出每个数的值

题解

最基础的树状数组了,就是修改区间[a,b]的值,询问单个元素的值

代码:

#include<iostream>

#include<cstring>

#include<cstdio>

#define MAXN 100005

using namespace std;

int c[MAXN];

int n;

int lowbit(int x)

{

    return x&-x;

}

void add(int x,int d)

{

    while(x<=n)

    {

        c[x]+=d;

        x+=lowbit(x);

    }

}

int sum(int x)

{

    int ret=0;

    while(x>0)

    {

        ret+=c[x];

        x-=lowbit(x);

    }

    return ret;

}

int main(void)

{

    int i,j,l,r;

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

    {

        memset(c,0,sizeof(c));

        for(i=1;i<=n;i++)

        {

            scanf("%d%d",&l,&r);

            add(l,1);

            add(r+1,-1);

        }

        for(i=1;i<n;i++)

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

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

    }

    return 0;

}



 

 

你可能感兴趣的:(color)