HDU1556 color the ball (树状数组)

来源:互联网 发布:异次元杀人矩阵 编辑:程序博客网 时间:2024/06/02 01:00

http://acm.hdu.edu.cn/showproblem.php?pid=1556

思路:直接用树状数组即可,因为更新的是区间,所以需要更新2次。
比如更新 [1,3] ,n的大小为6,那么update(1,1)其实是更新了[1,6],所以需要将[4,6]的每个元素减一,即update(4,-1).

#include<iostream>#include<stdio.h>#define maxn 100005#define lowbit(x) ((x)&(-(x)))using namespace std;int n,a,b,color[maxn];void update(int x,int y){    while(x<=n)     {        color[x]+=y;        x+=lowbit(x);     }}int quary(int x){    int sum=0;    while(x>0)    {        sum+=color[x];        x-=lowbit(x);    }    return sum;}int main(){    while(scanf("%d",&n)&&n)    {        for(int x=0;x<=n;x++) color[x]=0;        for(int x=0;x<n;x++)        {            scanf("%d%d",&a,&b);            update(a,1);update(b+1,-1);        }        for(int x=1;x<n;x++)        printf("%d ",quary(x));        printf("%d\n",quary(n));    }}
原创粉丝点击