hdu 1556

来源:互联网 发布:域名备案授权码 编辑:程序博客网 时间:2024/05/15 04:37
这题同样也是用树状数组去过,像上一篇写的一样,对于树状数组我们只需抽象出这样一个数组模型,对数组一段区间求和,并且数组元素的值会变化,就可以用树状数组进行加速,至于树状数组的结构和实现,可以先放一下。那么这题同样,给定一个区间(a,b),例如(1,3),我们只需在a[1]+1,a[4]-1,如果要查询3气球的涂色次数,然后将a[3]+a[2]+a[1]加起来即可。
 抽象出来,就是对于 a b闭区间,遍历里面整数点一次,就是对a加1,对b+1减一,多次重复这个过程,当求某个点x遍历次数时,从a1加到ax既可 ,那么这个数组模型和树状数组所需那个底层数组一样,就可用树状数组加速。建议用手推一下这个过程,更加容易理解。


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


#include<cstdio>#include<cstring>#include<cstdlib>int n,a,b,c[1000000];int lowbit(int t){    return t&(-t);}void update(int pos,int num){    while(pos<=n)    {        c[pos]+=num;        pos+=lowbit(pos);    }}int sum(int num){    int sum=0;    while(num>0)    {        sum+=c[num];        num-=lowbit(num);    }    return sum;}int main(void){    while(scanf("%d",&n)&&n)    {        memset(c,0,sizeof(c));        for(int i=0;i<n;i++)        {            scanf("%d%d",&a,&b);            update(a,1);            update(b+1,-1);        }        for(int i=1;i<n;i++)        {            printf("%d ",sum(i));        }        printf("%d\n",sum(n));    }    return 0;}
0 0
原创粉丝点击