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");}
}

转载于:https://www.cnblogs.com/GoldenFingers/p/9107312.html

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

  1. 线段树的数组大小下限及证明

    线段树的数组大小下限及证明 手动博客搬家: 本文发表于20170820 20:23:52, 原地址https://blog.csdn.net/suncongbo/article/details/774 ...

  2. 【学习笔记】线段树的数组大小下限及证明

    手动博客搬家: 本文发表于20170820 20:23:52, 原地址https://blog.csdn.net/suncongbo/article/details/77432667 线段树是一种将一 ...

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

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

  4. 树状数组(单点修改,区间修改等)

    前言:上次练习树状数组的专题还是半年前,练了练就过了,后来学了线段树,觉得树状数组这啥啊,线段树不香吗,就再也没管过树状数组了.直到几天前被树状数组血虐了,急忙爬回来补树状数组.(事实证明学的越少,越 ...

  5. GTY‘s gay friends 线段树+前缀和

    链接 题意:n个数,m次询问,每次询问判断一个区间是否为一个序列 解法: 判断长度为x的序列只要满足两个条件: 1.区间和为(1+x)*x/2  2.1~x每个数只出现一次: 对于第一个限制前缀和求区 ...

  6. P1714 切蛋糕(线段树+前缀和)

    P1714 切蛋糕 解题思路:求连续区间不超过k的最大值.先求出前缀和,线段树维护前缀和,在一个长度为k的区间,找到前缀和最小的,用最后的值减去这个值,得到的就是在这个区间里的最大值.如果长度不能到达 ...

  7. 树状数组求逆序对_区间和的个数(树状数组)

    327. 区间和的个数 给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper. 区间和 S(i, j) 表示在 nums 中,位置从 i ...

  8. 406 “Z”型矩阵 思维+树状数组 [代码源][namomo spring camp]每日一题div1

    Educational Codeforces Round 8 E. Zbazi in Zeydabad codeforces题目链接 一道CF的E题 晚点补文字,先给代码 //acmer mxc #i ...

  9. 线段树(点查询、区间查询、区间修改)模板

    简单记录一下自己的代码,以后方便复习 其实有了这样子的一个模板,题目变式自己改改就可以,比如说加减变成乘除等等. #pragma GCC optimize(3,"Ofast",&q ...

  10. 解题报告:SP1043 GSS4 - Can you answer these queries III(GSS线段树八部曲之三)(区间最大连续子段和)

    要注意输入的数据有坑,x可能大于y- 我们可以模块化编程,使得整个代码井井有条 函数可以重名,只要参数不一样就行. 来源 yxc老师的上课板书 然后就是简单的代码了 #include<iostr ...

最新文章

  1. CIFS NFS SMB Samba 文件共享协议 介绍
  2. 安装keras and theano于google colab上
  3. python3 快速排序
  4. Java操作shell脚本
  5. 在VS2013平台下如何快速解决c++代码内存泄漏问题
  6. linux指定cpu运行程序,进程/线程绑定到特定CPU核的linux实现(有代码有实例)
  7. DAY16-Django之model
  8. Winform 类似于WINDOWS的选择文件夹对话框
  9. [导入]DataTable的排序、检索、合并
  10. 音阶频率对照表_八度音阶和频率的关
  11. 动词ing形式的5种用法_动词 ing 形式用法归纳
  12. 遛狗已经不流行,“遛”智能购物车成为新潮流
  13. 区块链是什么,如何简单易懂地介绍区块链
  14. ASP.NET mvcConf Videos Available
  15. jxl 删除excel重复的行
  16. html图片靠右浮动 文字左侧环绕,CSS 模拟float实现center文字左右环绕图片的效果...
  17. IE低版本提示下载新的浏览器js--IEOutTips.zip
  18. 小爱同学指令大全_小爱同学有哪些隐藏功能?小爱同学实用隐藏功能大汇总
  19. aubo-i5机械臂(1)-正运动学求解
  20. 分布式文件系统FastDFS详解-附带视频教程

热门文章

  1. 使用 Spring Boot 开发 Web 项目
  2. Spring知识点简介
  3. 运维,请警惕脚本灾难!
  4. 开发者生态与双引擎:华为的雄心壮志!
  5. 使用CoreTelephony获得SIM卡网络运营商名称
  6. http://ilinuxkernel.com/?p=1328
  7. python3.4.3如何获取文件的路径
  8. Postgresql----libpq
  9. API开放平台基于accessToken实现
  10. B: Break Prime