• HDOJ1556 Color the ball


    Color the ball

    Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 3833    Accepted Submission(s): 2081


    Problem Description
    N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色。但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗?
     
    Input
    每个测试实例第一行为一个整数N,(N <= 100000).接下来的N行,每行包括2个整数a b(1 <= a <= b <= N)。
    当N = 0,输入结束。
     
    Output
    每个测试实例输出一行,包括N个整数,第I个数代表第I个气球总共被涂色的次数。
     
    Sample Input
    3 1 1 2 2 3 3 3 1 1 1 2 1 3 0
     
    Sample Output
    1 1 1 3 2 1
    //树状数组
    #include<cstdio>
    #include<cstring>
    
    int n,c[100001];
    int lowbit(int x)/*求2的k次方
    				 (设节点编号为x,那么这个节点管辖的区间为2^k(其中k为x二进制末尾0的个数)个元素.
    				 因为这个区间最后一个元素必然为Ax,所以很明显:Cn = A(n – 2^k + 1) + ... + An)
    				 */
    {  				
    	return x&(-x);
        //return x&(x^(x–1));//两种写法都对
    
    }
    
    void update(int bit,int num)
    {
    	while(bit<=n)
    	{
    		c[bit]+=num;
    		bit+=lowbit(bit);
    	}
    }
    
    int getsum(int t)
    {
    	int s=0;
    	while(t>0)
    	{
    		s+=c[t];
    		t-=lowbit(t);
    	}
    	return s;
    }
    
    int main()
    {
    	while(scanf("%d",&n),n)
    	{
    		int i,a,b;
    		memset(c,0,sizeof(c));
    		for(i=1;i<=n;++i)
    		{
    			scanf("%d%d",&a,&b);
    			update(a,1);
    			update(b+1,-1);
    		}
    		printf("%d",getsum(1));
    		for(i=2;i<=n;++i)
    			printf(" %d",getsum(i));
    		printf("\n");
    	}
    	return 0;
    }
    
    功不成,身已退
  • 相关阅读:
    Redis订阅和发布模式和Redis事务
    Redis介绍和环境安装
    Redis基本数据类型
    MongoDB导入导出以及数据库备份
    MongoDB-python的API手记
    MongoDB对应SQL语句
    判断是否微信浏览器访问并得到微信版本号
    windows 下编译php扩展库pecl里的扩展memcache
    用PHPExcel类读取excel文件的内容
    用excel.php类库导出excel文件
  • 原文地址:https://www.cnblogs.com/dongsheng/p/2604145.html
Copyright © 2020-2023  润新知