Color the ball(给球涂色)

hdoj 1556

解决:树状数组基础,插段求点 数据大小100000

/*本来是不打算写这个报告,就是一个基础的插段问点,但是ac之后,又搜了一个代码,让对树状数组有了一点新的认识,就从新改了一下,仍然是可以向后更新,向前求和,只是更新的时候,多更新的要减去,求点的时候向前累计,只有更新到的点才有值*/

#include <iostream>

#include <cstdio>

#include <cstring>

using namespace std;

const int N=100005;

int c[N];

int n;

int lowbit(int x)

{

    return x&(-x);

}

void update(int p,int inc)

{

    for(int i=p;i<=n;i+=lowbit(i))

    c[i]+=inc;

}

int get(int p)

{

    int res=0;

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

     res+=c[i];

    return res; 

}

int main()

{

    int a,b;

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

    {

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

        for(int i=0;i<n;i++)

        {

            scanf("%d",&a);

            scanf("%d",&b);

            update(a,1); 

            update(b+1,-1);

        }

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

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

        printf("%d\n",get(n));

    }

    system("pause");

    return 0;

}

 

你可能感兴趣的:(color)