Color the ball

Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 21453 Accepted Submission(s): 10399

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


解题心得:

  1. 这个题可以用一个前缀数组就可以过了,给你两个数s和e,里面的所有的气球的颜色改变,可以创建一个数组num,长度为n,将num[s]++,num[e+1]–,然后用sum将前面的数加起来就好了,直接看代码吧。
  2. 这个题还可以使用线段树来写,先建立一个线段树,时间是logn,将每个区间维护更新,维护一次的时间是logn,最后再输出时间还是logn。在更新的时候只要找到最前面的一个区间就可以了,不用在找到了一个区间的还继续将下面的子节点继续更新,因为在最后输出的时候只要从起点开始向下面的数找就行了,有一个就加一个就行了。(我的线段树跑了967ms,额)

前缀数组

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+100;
int num[maxn];
int main()
{
int n;
while(scanf("%d",&n) && n)
{
memset(num,0,sizeof(num));
int N = n;
while(N--)
{
int a,b;
scanf("%d%d",&a,&b);
//前缀数组
num[a] ++;
num[b+1]--;
}
int sum = 0;
sum += num[1];
printf("%d",sum);
for(int i=2;i<=n;i++)
{
sum += num[i];
printf(" %d",sum);
}
printf("\n");
}
return 0;

线段树

/*
这个虽然是区间更新,但是在最后输出的只是一个点的值
所以在更新可以是区间更新,但是输出还是点的输出
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+100;
struct node
{
int l,r,num;
}tree[maxn*4]; //先建一个线段树
void build_tree(int l,int r,int root)
{
int mid;
tree[root].l = l;
tree[root].r = r;
tree[root].num = 0;
if(l == r)
return;
mid = (l + r) / 2;
build_tree(l,mid,root*2);
build_tree(mid+1,r,root*2+1);
} //每一次区间更新
int pushup(int l,int r,int root)
{
int mid;
if(tree[root].l == l && tree[root].r == r)
{
tree[root].num ++;
return 0;
}
mid = (tree[root].l + tree[root].r) / 2;
if(r <= mid)
return pushup(l,r,root*2);
else if(l > mid)
return pushup(l,r,root*2+1);
else
{
pushup(l,mid,root*2);
pushup(mid+1,r,root*2+1);
}
} //最后从根节点找答案
int Ans(int pos,int root,int ans)
{
int mid;
if(tree[root].l > pos || tree[root].r < pos)//找歪了,顺便剪个枝
return ans;
if(tree[root].num)
ans += tree[root].num;
if(tree[root].l == tree[root].r)
return ans;
mid = (tree[root].l + tree[root].r) / 2;
if(pos <= mid)
return Ans(pos,root*2,ans);
else if(pos > mid)
return Ans(pos,root*2+1,ans);
} int main()
{
int n;
while(scanf("%d",&n) && n)
{
build_tree(1,n,1);
int N = n;
while(N--)
{
int a,b;
scanf("%d%d",&a,&b);
pushup(a,b,1);
}
printf("%d",Ans(1,1,0));
for(int i=2;i<=n;i++)
{
printf(" %d",Ans(i,1,0));
}
printf("\n");
}
}

线段树、前缀数组:HDU1591-Color the ball(区间更新、简单题)的更多相关文章

  1. 树状数组模板--Color the ball

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

  2. 线段树:CDOJ1597-An easy problem C(区间更新的线段树)

    An easy problem C Time Limit: 4000/2000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Pr ...

  3. hdu 1556 Color the ball (区间更新 求某点值)

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

  4. CSU 1809 Parenthesis(线段树+前缀和)

    Parenthesis Problem Description: Bobo has a balanced parenthesis sequence P=p1 p2-pn of length n and ...

  5. HDU 5172 GTY's gay friends 线段树+前缀和+全排列

    题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5172 bc(中文):http://bestcoder.hdu.edu.cn/contest ...

  6. AcWing:246. 区间最大公约数(线段树 + 增量数组(树状数组) + 差分序列)

    给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“C l r d”,表示把 A[l],A[l+1],…,A[r] 都加上 d. 2.“Q l r”,表示询问 A[l],A[l ...

  7. Libre OJ 130、131、132 (树状数组 单点修改、区间查询 -> 区间修改,单点查询 -> 区间修改,区间查询)

    这三题均可以用树状数组.分块或线段树来做 #130. 树状数组 1 :单点修改,区间查询 题目链接:https://loj.ac/problem/130 题目描述 这是一道模板题. 给定数列 a[1] ...

  8. HDU 1166 【线段树 || 树状数组,单点修改 维护区间和】

    题目链接 HDU 1166 大概题意: 第一行一个整数T,表示有T组数据.每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工 ...

  9. 【BZOJ】1651: [Usaco2006 Feb]Stall Reservations 专用牛棚(线段树/前缀和 + 差分)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1651 很奇妙.. 我们发现,每一时刻的重叠数选最大的就是答案.... orz 那么我们可以线段树维护 ...

随机推荐

  1. (转)nginx域名访问的白名单配置梳理

    nginx域名访问的白名单配置梳理 原文:http://www.cnblogs.com/kevingrace/p/6086652.html 在日常运维工作中,会碰到这样的需求:设置网站访问只对某些ip ...

  2. JS中比较的数值如何比较大小

    <script type="text/javascript"> function check_num(){ var num=document.getElementByI ...

  3. String类、StringBuilder类、StringBuffer类

    String类是不可变类,创建了一个String对象后,该String对象中的字符序列不能被改变. StringBuilder是字符序列可变的字符串类,提供了一系列修改字符串的方法. StringBu ...

  4. 《移动Web前端高效开发实战》笔记2——使用Gulp构建一个ECMAScript 6和Sass应用

    8.3.1 安装和配置 运行Gulp需要Node.js环境,请参看第二章内容搭建Node.js环境.使用NPM全局安装Gulp,命令如下: npm install gulp-cli –g 然后,在项目 ...

  5. Dom EVENT对象

    Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 事件通常与函数结合使用,函数不会在事件发生前被执行! 一:测试按键 function which ...

  6. UIButton 图片文字位置

    在实际开发过程中经常在按钮上添加文字和图片,位置和图片的位置根据需求放置也是不一样的.下面实现了各种显示方式,如下图: UIButton+LSAdditions.h // // UIButton+LS ...

  7. u-boot剖析(一)----Makefile分析

    由于u-boot比较庞大,所以我们分开来分析,对于一个大型的项目我们想快速的了解其代码架构和内容,最方便的方法就是分析Makefile,所以我们今天以三星的s3c2440来分析Makefile.我们今 ...

  8. (转)VC得到可用的串口列表

    //枚举串口 //参数:bEnablePort,哪个串口有效,bEnablePort[0]表示COM1,bEnablePort[n-1]表示COMn //返回值:有效的串口个数 int EnumAll ...

  9. Securityonion介绍

        下载地址     https://github.com/Security-Onion-Solutions/security-onion/blob/master/Verify_ISO.md   ...

  10. LibreOJ #2037. 「SHOI2015」脑洞治疗仪

    线段树区间合并问题 恶心... 屠龙宝刀点击就送 #include <cstdio> #define N 200005 struct Segment { int l,r,mid,sum,l ...