线段树、前缀数组:HDU1591-Color the ball(区间更新、简单题)
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
解题心得:
- 这个题可以用一个前缀数组就可以过了,给你两个数s和e,里面的所有的气球的颜色改变,可以创建一个数组num,长度为n,将num[s]++,num[e+1]–,然后用sum将前面的数加起来就好了,直接看代码吧。
- 这个题还可以使用线段树来写,先建立一个线段树,时间是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(区间更新、简单题)的更多相关文章
- 树状数组模板--Color the ball
Color the ball HDU - 1556 N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电 ...
- 线段树:CDOJ1597-An easy problem C(区间更新的线段树)
An easy problem C Time Limit: 4000/2000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Pr ...
- hdu 1556 Color the ball (区间更新 求某点值)
Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a ...
- CSU 1809 Parenthesis(线段树+前缀和)
Parenthesis Problem Description: Bobo has a balanced parenthesis sequence P=p1 p2-pn of length n and ...
- HDU 5172 GTY's gay friends 线段树+前缀和+全排列
题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5172 bc(中文):http://bestcoder.hdu.edu.cn/contest ...
- 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 ...
- Libre OJ 130、131、132 (树状数组 单点修改、区间查询 -> 区间修改,单点查询 -> 区间修改,区间查询)
这三题均可以用树状数组.分块或线段树来做 #130. 树状数组 1 :单点修改,区间查询 题目链接:https://loj.ac/problem/130 题目描述 这是一道模板题. 给定数列 a[1] ...
- HDU 1166 【线段树 || 树状数组,单点修改 维护区间和】
题目链接 HDU 1166 大概题意: 第一行一个整数T,表示有T组数据.每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工 ...
- 【BZOJ】1651: [Usaco2006 Feb]Stall Reservations 专用牛棚(线段树/前缀和 + 差分)
http://www.lydsy.com/JudgeOnline/problem.php?id=1651 很奇妙.. 我们发现,每一时刻的重叠数选最大的就是答案.... orz 那么我们可以线段树维护 ...
随机推荐
- (转)Module ngx_http_fastcgi_module
Example ConfigurationDirectives fastcgi_bind fastcgi_buffer_size fastcgi_buffering f ...
- 牛客网Java刷题知识点之面向对象java的四大特性(抽象、封装、继承、多态)
不多说,直接上干货! 面向对象java的四大特性之抽象 抽象就是有点模糊的意思,还没确定好的意思. 就比如,要定义一个方法和类.但还没确定怎么去实现它的具体一点的子方法,那我就可以用抽象类或接口.具体 ...
- hashMap的具体实现
HashMap是Java中的一个重要的数据结构! 与HashMap更重要的一个数据结构是HashTable,其中最重要的区别是HashTable传说中是线程安全的(之所以说他是传说是因为我并没有去理解 ...
- 关于office转换成pdf组件服务中的DCOM配置问题
在开始->运行 中录入“dcomcnfg” 单击“确定”后弹出“组件服务”窗口 依次选择“组件服务”->“计算机”->“我的电脑”->“DCOM配置” 在“DCOM配置”下找到 ...
- My1stServlet
Servlet可以看做是一个嵌套了Html代码的Java类: 1.首先创建一个Servlet类,例子如下 import java.io.PrintWriter; import javax.servle ...
- 一条shell统计代码行数
Xcode统计代码,用shell命令即可,非常简单.打开终端,进入你的工程目录,执行下列代码 find . -name "*.m" -or -name "*.h" ...
- Hello World另类写法
#include<iostream> #define _ using namespace std; #define __ int main() #define ___ { #define ...
- ABAP日期和时间运算
"日期运算是以天为单位,时间运算以秒为单位.DATA:date1 TYPE d. "服务器当前日期date1 = sy-datum.WRITE: / date1 . "2 ...
- html-jquery/js引用外部图片时遇到看不了或出现403情况解决方法
<script type="text/javascript"> function showImg(url) { var frameid = 'frameimg' + M ...
- Cocos2d-x v3.1 初识(一)
Cocos2d-x v3.1 初识(一) Cocos2d-x从以前苹果平台上的Cocos2d发展而来,版本已经更新到了3.1.1.作为一个跨平台的游戏开发引擎,现在已经被上百个国家在使用,这也是国人的 ...