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. Spark Mllib里的Mllib基本数据类型(图文详解)

    不多说,直接上干货! Spark Mllib基本数据类型,根据不同的作用和应用场景,分为四种不同的类型 1.Local  vector : 本地向量集,主要向spark提供一组可进行操作的数据集合 2 ...

  2. spark-2.2.0-bin-hadoop2.6和spark-1.6.1-bin-hadoop2.6发行包自带案例全面详解(java、python、r和scala)之Basic包下的JavaPageRank.java(图文详解)

    不多说,直接上干货! spark-1.6.1-bin-hadoop2.6里Basic包下的JavaPageRank.java /* * Licensed to the Apache Software ...

  3. git从无到有建立一个仓库并上传文件

    第一步,创建仓库 登录自己的码云  第二步,本地操作 1.到你所要上传的文件夹中右键 选择git bash here 2.初始化项目 git init 3.连接远程仓库 刚才我们建立的时候的远程地址就 ...

  4. 准备Kendo UI 开发环境

    准备 首先你需要从 Telerik 网站下载试用版开发包,注意需要注册后才能下载. 下载后直接解压后包含下面几个文件和目录: ./examples – 示例. /js – minified 化后的 J ...

  5. RK3288开发过程中遇到的问题点和解决方法之Framework

    删除小电池图标及百分比 a.SystemUI/.../statusbar/policy/BatteryController.java mBatteryPercentageView.setVisibil ...

  6. O2O创业团队,遇到生死悠关的问题,希望大家支招?

    简单概括下情况:公司名下有两个内部创业团队,A团队成立3年以上,现在模式基本成熟稳定,有固定营收,但是还未收支平衡:B团队O2O项目,成立5个月左右,还处于萌芽阶段,技术+运营+市场共计9名成员,现总 ...

  7. JSON 序列化格式

    一.C#处理简单json数据json数据: 复制代码代码如下: {"result":"0","res_info":"ok" ...

  8. 使用com.sun.imageio.plugins.png.PNGMetadata读取图片的元数据

    所谓图片元数据,就是除了我们肉眼看到的图片内容外,隐藏在这些内容背后的一些技术数据. 本文介绍如何使用Java代码将一张图片的隐藏信息读取出来. 首先不需要下载任何额外的Java库,用JDK自带的库就 ...

  9. cesium-大规模人群运动测试

    环境:cesium1.57: 笔记本电脑:集成显卡+独显Navida 1060 测试内容:大规模人群运动(500人,可设置运动的路径),可行性及帧率 测试结果:21-23FPS,较为流畅:集显70%- ...

  10. 【UML】使用环境(转)

    http://blog.csdn.net/sds15732622190/article/details/49404169 用例图         用例图是在需求文档中使用的,但一定要配合用例一同使用. ...