线段树、前缀数组: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 那么我们可以线段树维护 ...
随机推荐
- 2017 ACM Arabella Collegiate Programming Contest div2的题,部分题目写个题解
F. Monkeying Around 维护点在多少个线段上 http://codeforces.com/gym/101350/problem/F 题意:有m个笑话,每个笑话的区间是[L, R], ...
- tyvj P4879骰子游戏-美国70分
需要FFT优化... #include<iostream> #include<cstdio> #include<queue> #include<vector& ...
- asp.net重启web应用程序域
我把加载到static静态变量中了,是在数据库中存的,这样每次改了一下必须要重启一下web应用程序,每次去iis操作太麻烦了,于是找的了这个重启的办法,一句话代码: System.Web.HttpRu ...
- 一个很好用的侧滑框架ICSDrawerController实现的 QQ 侧滑及换肤功能
使用ICSDrawerController 实现侧滑功能 在ICSDrawerController 第三方上做了修改实现,QQ 点击头像打开关抽屉头像渐变的效果 - (void)hiddenHeadV ...
- codevs 4888 零件分组
4888 零件分组 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 现有一些棍状零件,每个零件都有 ...
- EF6 CodeFirst连接MySql 报nvarchar('max')错误解决办法
1.在DBContext类加标签[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))] 2.在Nuget控制台输入u ...
- SVN合并步骤
1.trunk->branch/tag 分支路径在分支文件夹中,选择右键检出 2.合并分支到主干分支新增 1.txt 文件 需要合并到主干 在trunck->鼠标右键合并->合并到不 ...
- Linux中根据访问日志统计访问量最高的前N个IP
前段时间面试中被问到如上问题,日常不怎么注意积累,以此谨记. 访问IP 页面[nxuser@im440-zh test]$ vi log 135.252.172.181 page1 136.252.1 ...
- .net 实现的上传下载,如果是图片就显示上传的图片
HTML: <div> <input id="fileUpload" type="file" runat="server" ...
- 徒手教你使用zookeeper编写服务发现
zookeeper是一个强一致[不严格]的分布式数据库,由多个节点共同组成一个分布式集群,挂掉任意一个节点,数据库仍然可以正常工作,客户端无感知故障切换.客户端向任意一个节点写入数据,其它节点可以立即 ...