HD_1556Color the ball

原创 2015年11月20日 21:20:08


                                                     Color the ball

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


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
 

Author
8600
 



   

这是一道典型的一维树状数组的变形,普通的一维树状数组的用途是:单点更新,区间求值。而这道题的则是用到树状数组的另一个用途:区间更新,单点求值。原理如下:


     假设原始数组的各个元素为a[1], a[2] ,…… a[n] ,  那么d[n] = a[1] + a[2] + …… + a[n] 求的就是前n项和,这就是树状数组的第一个用途:单点更新,区间求和。 


      然后,稍微做些改动,假设原始数组的各个元素为a[1]- 0 , a[2] - a[1] , a[3] - a[2] ,……,a[n] - a[n - 1] , 那么此时的前n项和 d[n] =a[n] ,也就是说,现在原始数组的前n项和d[n] 就等于单点的值a[n] ,大家看到这里是不是就有些明白了呢?


      接着,如果你想时区间[ a[m] …… a[n]  ] 中的所有值都+ Val ,那么只需将原始数组的第m (a[m]- a[m - 1] )  加上Val   和将第n + 1 (a[n +1] - a[n])  减去Val 就可以了, 这样当 m<= i <= n


      数列的前i 项和:


      d[i] = (a[1] - 0) + (a[2] - a[1]) + (a[3] -a[2]) + …… + (a[m] - a[m - 1] + val) + (a[m + 1] - a[m]) + …… + (a[i] - a[i -1] )  = a[i]  + val   

      同理当 i > n d[i]等于原来的 a[i]  。看到这里,大家是不是就豁然开朗啦。注意一点,这里a[1] …… a[n] 的初始值均为0 !! 请看代码:



#include<stdio.h>
#include<string.h>

#define MAXN 100005

int C[MAXN];
int n;

int lowbit (int x)
{
    return x & (-x);
}

void add(int x , int d)
{
    while(x <= n)
    { 
        C[x] += d ;
        x += lowbit(x) ;
    } 
}

int sum(int x) 
{
    int sumt = 0 ;
    while (x > 0) 
    {
        sumt += C[x] ;
        x -= lowbit(x) ;
    }
    return sumt ;
} 

int main()
{
    while ((scanf("%d" , &n) != EOF),n) 
    {
        memset(C , 0 , sizeof(C)) ;
        int t = n ;
        while ( t-- )
        {
            int a , b ;
            scanf("%d%d", &a , &b) ;
            add(a ,+1) ;
            add(b +1,-1) ;
        } 
        for(int i = 1 ; i <= n ; i ++)  
        {
            printf((i==n?"%d\n":"%d "), sum(i)) ;
        }
    }
    return 0 ;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU1556 color the ball【树状数组】解题报告

转载请注明原文地址:http://blog.csdn.net/huang8579/article/details/8770743 关于树状数组是什么? 请参照百度百科:http://baike...
  • huang8579
  • huang8579
  • 2013年04月08日 10:56
  • 3471

hdu1199Color the Ball (线段树 段更新+离散化)

Problem Description There are infinite balls in a line (numbered 1 2 3 ....), and initially all of t...
  • u010372095
  • u010372095
  • 2013年10月04日 11:38
  • 1362

OpenFire源码学习之一:XMPP基础知识

前面两张主要讲基础部分。XMPP与Mina有部分抄写于互联网的其他大事 XMPP概述 XMPP: The Extensible Messaging and Presence Protoco...
  • huwenfeng_2011
  • huwenfeng_2011
  • 2015年02月02日 19:38
  • 29627

Color the ball - HDU 1556 - 线段树 区间更新单点查询

Color the ball - HDU 1556 - 线段树 区间更新单点查询  国际惯例中文题目不解释,思路直接裸线段树,Lazy思想入门题。  Lazy传送门:延迟更新详解AC代码:// // ...
  • xs18952904
  • xs18952904
  • 2017年05月28日 11:22
  • 312

HDu 1556 Color the ball【线段树&&树状数组】区间更新,单点查询

Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To...
  • liuke19950717
  • liuke19950717
  • 2015年11月18日 21:02
  • 286

HDU~1556 Color the ball(线段树区间更新||树状数组)

Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T...
  • m0_37134257
  • m0_37134257
  • 2017年04月28日 16:21
  • 178

数据结构之线段树 入门HDU1556 color the ball

Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...
  • lxx_nico
  • lxx_nico
  • 2014年11月07日 20:46
  • 431

HDU 1556 Color the ball(线段树区间更新区间查询模板)

Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a   Input 每个测试实例第一行为一个整数N,(N ...
  • CillyB
  • CillyB
  • 2017年05月04日 13:47
  • 177

HDU1556 color the ball【树状数组】解题报告

转载请注明原文地址:http://blog.csdn.net/huang8579/article/details/8770743 关于树状数组是什么? 请参照百度百科:http://baike...
  • huang8579
  • huang8579
  • 2013年04月08日 10:56
  • 3471

HDOJ 1556 Color the ball(树状数组 & 线段树)

Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others...
  • shouwang_tomorrow
  • shouwang_tomorrow
  • 2015年11月03日 21:07
  • 173
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HD_1556Color the ball
举报原因:
原因补充:

(最多只允许输入30个字)