zoukankan      html  css  js  c++  java
  • 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;
    }
    
    功不成,身已退
  • 相关阅读:
    HTML学习基础(一)
    初识C#
    SQL小知识
    jQuery(四)
    jQuery(三)
    认识jQuery(二)
    认识Jquery
    初识Javascript
    初识HTML
    博客,你好!
  • 原文地址:https://www.cnblogs.com/dongsheng/p/2604145.html
Copyright © 2011-2022 走看看