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

题意:N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数[a,b]之间的气球染一次色,最后问每个气球染了多少种颜色。

分析:这是树状数组的第二种应用,区间成段更新,然后求某点的值。

update(x,num)表示x位置的值增加num,sum(x)表示求1到x的和。

更新[l,r]区间时,

先update(l,k),然后update(r+1,-k),就会导致sum(l)到sum(r)的值均增加了k,然后[1,l)和(r,max)这两个范围内的sum都不变,这样sum(x)就是x这个点当前的值了。

在纸上自己画一画,模拟一下就能明白了。

AC代码如下:

 #include<stdio.h>
#include<string.h>
#define N 100010
int d[N],n;
int lowbit(int x)
{
return x&(-x);
}
void update(int x,int num)
{
while(x<=n)
{
d[x]+=num;
x+=lowbit(x);
}
}
int GetSum(int x)
{
int s=;
while(x>)
{
s+=d[x];
x-=lowbit(x);
}
return s;
}
int main()
{
int i,a,b;
while(scanf("%d",&n)&&n)
{
memset(d,,sizeof(d));
for(i=;i<n;i++)
{
scanf("%d%d",&a,&b);
update(a,);
update(b+,-);
}
for(i=;i<n;i++)
printf("%d ",GetSum(i));
printf("%d\n",GetSum(n));
}
return ;
}

上面的方法是树状数组最基本的向上修改,向下统计的形式,其实还可以向上统计,向下修改。

树状数组中的每个节点都代表了一段线段区间,每次更新的时候,根据树状数组的特性可以把b以前包含的所有区间都找出来,然后把b以前的

区间全部加一次染色次数。然后,再把a以前的区间全部减一次染色次数,这样就修改了树状数组中的[a,b]的区间染色次数,查询每一个点总的染色次

数的时候,就可以直接向上统计每个父节点的值,就是包含这个点的所有区间被染色次数,这就是树状数组中向下查询,向上统计的典型应用

这样的话update()和sum()的代码就需要修改了,详见代码。

AC代码如下:

 #include<stdio.h>
#include<string.h>
#define N 100010
int d[N],n;
int lowbit(int x)
{
return x&(-x);
}
void update(int x,int num)
{
while(x>)
{
d[x]+=num;
x-=lowbit(x);
}
}
int sum(int x)
{
int s=;
while(x<=n)
{
s+=d[x];
x+=lowbit(x);
}
return s;
}
int main()
{
int i,a,b;
while(scanf("%d",&n)&&n)
{
memset(d,,sizeof(d));
for(i=;i<n;i++)
{
scanf("%d%d",&a,&b);
update(a-,-);
update(b,);
}
for(i=;i<n;i++)
printf("%d ",sum(i));
printf("%d\n",sum(n));
}
return ;
}

hdu 1556 Color the ball(树状数组)的更多相关文章

  1. HDOJ/HDU 1556 Color the ball(树状数组)

    Problem Description N个气球排成一排,从左到右依次编号为1,2,3-.N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电动车从 ...

  2. HDU 1556 Color the ball (树状数组区间更新)

    水题,练习一下树状数组实现区间更新. 对于每个区间,区间左端点+1,右端点的后一位-1,查询每个位置的覆盖次数 #include <cstdio> #include <cstring ...

  3. HDU 1556 Color the ball 树状数组 题解

    Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电动 ...

  4. Color the ball(树状数组+线段树+二分)

    Color the ball Time Limit : 9000/3000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Tota ...

  5. HDU 1556 Color the ball【差分数组裸题/模板】

    N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一 ...

  6. hdu 1556:Color the ball(第二类树状数组 —— 区间更新,点求和)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  7. hdu 1556:Color the ball(线段树,区间更新,经典题)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  8. HDU.1556 Color the ball (线段树 区间更新 单点查询)

    HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...

  9. HDU 5862 Counting Intersections(离散化+树状数组)

    HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...

  10. hdu 5517 Triple(二维树状数组)

    Triple Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

随机推荐

  1. C#,清晨随手写

    关于昨晚“猜拳”的博客   大家一定要记得,C#的书写规范是很严格的   很严格很严格很严格  简单的说  下面这样就没办法取值 但是这样就可以取值 插眼,开撸

  2. 180807-Quick-Task 动态脚本支持框架之Groovy脚本加载执行

    Quick-Task 动态脚本支持框架之Groovy脚本加载执行 上一篇简答说了如何判断有任务动态添加.删除或更新,归于一点就是监听文件的变化,判断目录下的Groovy文件是否有新增删除和改变,从而判 ...

  3. .Net MVC缓存

    https://www.cnblogs.com/JoeSnail/p/7993903.html

  4. [笔试]CVTE 2019提前批 Windows应用开发笔试

    不定项选择(x20) 数据结构 以abcdefg的顺序入栈,不可能出现的出栈顺序 一棵二叉树给出中序遍历和后序遍历结果,求左子树的节点数 操作系统 Linux中用什么指令可以找到文件中所有以" ...

  5. appium 元素定位工具

    两种元素定位工具: 1.uiautomatorviewer是android-sdk自带的一个元素定位工具,目录D:\androidsdk\androidsdk\tools\bin . 双击启动uiau ...

  6. CentOS删除安装的程序

    以mysql举例: 首先查询安装包: rpm -qa|grep mysql 查询到的一个结果为:mysql-community-libs-5.7.13-1.el6.x86_64 yum 删除 yum ...

  7. 欧拉筛——$O(n)$复杂度的质数筛法

    欧拉筛法可以以\(O(n)\)的时间,空间复杂度求出\(1-n\)范围内的所有质数. 其核心思想是每个合数仅会被其最小的质因数筛去一次. See this website for more detai ...

  8. Java 内存模型_2

    title: Java 内存模型_2 date: 2017-01-28 02:04:06 tags: [JMM] categories: [Programming,Java] --- Why 理解 J ...

  9. Metasploit拿Shell

    进入metasploit系统 msfconsole Nmap端口扫描 nmap –sV IP(或者域名),如果机器设置有防火墙禁ping,可以使用nmap -P0(或者-Pn) –sV IP(或者域名 ...

  10. Python函数式编程中map()、reduce()和filter()函数的用法

    Python中map().reduce()和filter()三个函数均是应用于序列的内置函数,分别对序列进行遍历.递归计算以及过滤操作.这三个内置函数在实际使用过程中常常和“行内函数”lambda函数 ...