zoukankan      html  css  js  c++  java
  • hdu 1556 Color the ball(树状数组)

    转载请注明出处:http://blog.csdn.net/u012860063

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


    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

    解题思路:

    树状数组中的每一个节点都代表了一段线段区间,每次更新的时候,依据树状数组的特性能够把b曾经包括的所有区间都找出来,然后b之前的区间所有加一次染色次数。然后,再把a之前的区间所有减一次染色次数,这样就改动了树状数组中的[a,b]的区间染色次数,查询每一个点总的染色次数的时候,就能够直接向上统计每一个父节点的值,就是包括这个点的所有区间被染色次数,这就是树状数组中向下查询,向上统计的典型应用

    树状数组版:

    #include <cstdio>  
    #include <cstring>  
    #define maxn 100047  
    int c[maxn]; 
    int n,t;
    int Lowbit(int x)  // 2^k
    {
    	return x&(-x);
    }
    void update(int i, int x)//i点增量为x
    {
    	while(i > 0)
    	{
    		c[i] += x;
    		i -= Lowbit(i);
    	}
    }
    int sum(int x)//区间求和 [1,x]
    {
    	int sum=0;
    	while(x <= n)
    	{
    		sum+=c[x];
    		x +=Lowbit(x);
    	}
    	return sum;
    }
    
    int main() 
    { 
    	int i,j, a, b; 
        while(scanf("%d",&n) && n) 
        { 
            memset(c,0,sizeof(c)); 
            for(i = 1; i <= n; i++)
            { 
                scanf("%d%d",&a,&b);
                update(b,1);//将y下面的区间+1
    			update(a-1,-1);//将x下面的区间-1
            }
    		for(j = 1; j < n; j++)
    		{
    			printf("%d ",sum(j));
    		}
    		printf("%d
    ",sum(n));
        } 
        return 0; 
    } 
    


    非树状数组版:(事实上也是运用了树状数组版的思路)

    #include <cstdio>
    #include <cstring>
    int main()
    {
    	int n, i, j, a[100047], x, y;
    	while(scanf("%d",&n) && n)
    	{
    		memset(a,0,sizeof(a));
    		for(i = 1; i <= n; i++)
    		{
    			scanf("%d%d",&x,&y);
    			a[x]++,a[y+1]--;
    		}
    		int sum = a[1];
    		printf("%d",a[1]);
    		for(i = 2; i <= n; i++)
    		{
    			sum+=a[i];
    			printf(" %d",sum);
    		}
    		printf("
    ");
    	}
    	return 0;
    }


  • 相关阅读:
    Learning R笔记(一)
    聚类效果评测-Fmeasure和Accuracy及其Matlab实现
    R—读取数据(导入csv,txt,excel文件)
    R-模式(mode)和类(class)
    SQL Saturday 北京将于7月25日举办线下活动,欢迎参加
    开启微软机器学习之旅(1)--如何从不同数据源将样本数据导入Azure Machine Learning Studio
    微软机器学习Azure Machine Learning入门概览
    JS常用方法
    搭建django环境
    接口测试基础
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4210306.html
Copyright © 2011-2022 走看看