MetalSeed
思绪来得快去的也快,偶尔会在这里停留。
数据结构专题——线段树
版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]
线段树
转载请注明出处,谢谢!http://blog.csdn.NET/metalseed/article/details/8039326
持续更新中···
一:线段树基本概念
1:概述
线段树,类似区间树,是一个完全二叉树,它在各个节点保存一条线段(数组中的一段子数组),主要用于高效解决连续区间的动态查询问题,由于二叉结构的特性,它基本能保持每个操作的复杂度为O(lgN)!
性质:父亲的区间是[a,b],(c=(a+b)/2)左儿子的区间是[a,c],右儿子的区间是[c+1,b],线段树需要的空间为数组大小的四倍
2:基本操作(demo用的是查询区间最小值)
线段树的主要操作有:
(1):线段树的构造 void build(int node, int begin, int end);
主要思想是递归构造,如果当前节点记录的区间只有一个值,则直接赋值,否则递归构造左右子树,最后回溯的时候给当前节点赋值
此build构造成的树如图:
(2):区间查询int query(int node, int begin, int end, int left, int right);
(其中node为当前查询节点,begin,end为当前节点存储的区间,left,right为此次query所要查询的区间)
主要思想是把所要查询的区间[a,b]划分为线段树上的节点,然后将这些节点代表的区间合并起来得到所需信息
比如前面一个图中所示的树,如果询问区间是[0,2],或者询问的区间是[3,3],不难直接找到对应的节点回答这一问题。但并不是所有的提问都这么容易回答,比如[0,3],就没有哪一个节点记录了这个区间的最小值。当然,解决方法也不难找到:把[0,2]和[3,3]两个区间(它们在整数意义上是相连的两个区间)的最小值“合并”起来,也就是求这两个最小值的最小值,就能求出[0,3]范围的最小值。同理,对于其他询问的区间,也都可以找到若干个相连的区间,合并后可以得到询问的区间。
可见,这样的过程一定选出了尽量少的区间,它们相连后正好涵盖了整个[left,right],没有重复也没有遗漏。同时,考虑到线段树上每层的节点最多会被选取2个,一共选取的节点数也是O(log n)的,因此查询的时间复杂度也是O(log n)。
线段树并不适合所有区间查询情况,它的使用条件是“相邻的区间的信息可以被合并成两个区间的并区间的信息”。即问题是可以被分解解决的。
(3):区间或节点的更新 及 线段树的动态维护update (这是线段树核心价值所在,节点中的标记域可以解决N多种问题)
动态维护需要用到标记域,延迟标记等。
a:单节点更新
b:区间更新(线段树中最有用的)
需要用到延迟标记,每个结点新增加一个标记,记录这个结点是否被进行了某种修改操作(这种修改操作会影响其子结点)。对于任意区间的修改,我们先按照查询的方式将其划分成线段树中的结点,然后修改这些结点的信息,并给这些结点标上代表这种修改操作的标记。在修改和查询的时候,如果我们到了一个结点p,并且决定考虑其子结点,那么我们就要看看结点p有没有标记,如果有,就要按照标记修改其子结点的信息,并且给子结点都标上相同的标记,同时消掉p的标记。(优点在于,不用将区间内的所有值都暴力更新,大大提高效率,因此区间更新是最优用的操作)
void Change来自dongxicheng.org
3:主要应用
(1):区间最值查询问题 (见模板1)
(2):连续区间修改或者单节点更新的动态查询问题 (见模板2)
(3):多维空间的动态查询 (见模板3)
二:典型模板
模板1:
RMQ,查询区间最值下标---min
模板2:
连续区间修改或者单节点更新的动态查询问题 (此模板查询区间和)
模板3:
多维空间的动态查询
三:练习题目
下面是hh线段树代码,典型练习哇~
在代码前先介绍一些我的线段树风格:
- maxn是题目给的最大区间,而节点数要开4倍,确切的来说节点数要开大于maxn的最小2x的两倍
- lson和rson分辨表示结点的左儿子和右儿子,由于每次传参数的时候都固定是这几个变量,所以可以用预定于比较方便的表示
- 以前的写法是另外开两个个数组记录每个结点所表示的区间,其实这个区间不必保存,一边算一边传下去就行,只需要写函数的时候多两个参数,结合lson和rson的预定义可以很方便
- PushUP(int rt)是把当前结点的信息更新到父结点
- PushDown(int rt)是把当前结点的信息更新给儿子结点
- rt表示当前子树的根(root),也就是当前所在的结点
整理这些题目后我觉得线段树的题目整体上可以分成以下四个部分:
单点更新:最最基础的线段树,只更新叶子节点,然后把信息用PushUP(int r)这个函数更新上来
- hdu1166 敌兵布阵
- 题意:O(-1)
- 思路:O(-1)
线段树功能:update:单点增减 query:区间求和
code:
hdu1754 I Hate It
题意:O(-1)
思路:O(-1)
线段树功能:update:单点替换 query:区间最值
hdu1394 Minimum Inversion Number
题意:求Inversion后的最小逆序数
思路:用O(nlogn)复杂度求出最初逆序数后,就可以用O(1)的复杂度分别递推出其他解
线段树功能:update:单点增减 query:区间求和
hdu2795 Billboard
题意:h*w的木板,放进一些1*L的物品,求每次放空间能容纳且最上边的位子
思路:每次找到最大值的位子,然后减去L
线段树功能:query:区间求最大值的位子(直接把update的操作在query里做了)
题意:O(-1)
思路:O(-1)
线段树功能:update:成段替换 (由于只query一次总区间,所以可以直接输出1结点的信息)
poj3468 A Simple Problem with Integers
题意:O(-1)
思路:O(-1)
线段树功能:update:成段增减 query:区间求和
poj2528 Mayor’s posters
题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报
思路:这题数据范围很大,直接搞超时+超内存,需要离散化:
离散化简单的来说就是只取我们需要的值来用,比如说区间[1000,2000],[1990,2012] 我们用不到[-∞,999][1001,1989][1991,1999][2001,2011][2013,+∞]这些值,所以我只需要1000,1990,2000,2012就够了,将其分别映射到0,1,2,3,在于复杂度就大大的降下来了
所以离散化要保存所有需要用到的值,排序后,分别映射到1~n,这样复杂度就会小很多很多
而这题的难点在于每个数字其实表示的是一个单位长度(并非一个点),这样普通的离散化会造成许多错误(包括我以前的代码,poj这题数据奇弱)
给出下面两个简单的例子应该能体现普通离散化的缺陷:
例子一:1-10 1-4 5-10
例子二:1-10 1-4 6-10
普通离散化后都变成了[1,4][1,2][3,4]
线段2覆盖了[1,2],线段3覆盖了[3,4],那么线段1是否被完全覆盖掉了呢?
例子一是完全被覆盖掉了,而例子二没有被覆盖
为了解决这种缺陷,我们可以在排序后的数组上加些处理,比如说[1,2,6,10]
如果相邻数字间距大于1的话,在其中加上任意一个数字,比如加成[1,2,3,6,7,10],然后再做线段树就好了.
线段树功能:update:成段替换 query:简单hash
poj3225 Help with Intervals
题意:区间操作,交,并,补等
思路:
我们一个一个操作来分析:(用0和1表示是否包含区间,-1表示该区间内既有包含又有不包含)
U:把区间[l,r]覆盖成1
I:把[-∞,l)(r,∞]覆盖成0
D:把区间[l,r]覆盖成0
C:把[-∞,l)(r,∞]覆盖成0 , 且[l,r]区间0/1互换
S:[l,r]区间0/1互换
成段覆盖的操作很简单,比较特殊的就是区间0/1互换这个操作,我们可以称之为异或操作
很明显我们可以知道这个性质:当一个区间被覆盖后,不管之前有没有异或标记都没有意义了
所以当一个节点得到覆盖标记时把异或标记清空
而当一个节点得到异或标记的时候,先判断覆盖标记,如果是0或1,直接改变一下覆盖标记,不然的话改变异或标记
开区间闭区间只要数字乘以2就可以处理(偶数表示端点,奇数表示两端点间的区间)
线段树功能:update:成段替换,区间异或 query:简单hash
poj1436 Horizontally Visible Segments
poj2991 Crane
Another LCIS
Bracket Sequence
区间合并
题意:1 a:询问是不是有连续长度为a的空房间,有的话住进最左边
2 a b:将[a,a+b-1]的房间清空
思路:记录区间中最长的空房间
线段树操作:update:区间替换 query:询问满足条件的最左断点
练习
hdu3308 LCIS
hdu3397 Sequence operation
hdu2871 Memory Control
hdu1540 Tunnel Warfare
CF46-D Parking Lot
题意:矩形面积并
思路:浮点数先要离散化;然后把矩形分成两条边,上边和下边,对横轴建树,然后从下到上扫描上去,用cnt表示该区间下边比上边多几个,sum代表该区间内被覆盖的线段的长度总和
这里线段树的一个结点并非是线段的一个端点,而是该端点和下一个端点间的线段,所以题目中r+1,r-1的地方可以自己好好的琢磨一下
题意:矩形周长并
思路:与面积不同的地方是还要记录竖的边有几个(numseg记录),并且当边界重合的时候需要合并(用lbd和rbd表示边界来辅助)
线段树操作:update:区间增减 query:直接取根节点的值
练习
hdu3265 Posters
hdu3642 Get The Treasury
poj2482 Stars in Your Window
poj2464 Brownie Points II
hdu3255 Farming
ural1707 Hypnotoad’s Secret
uva11983 Weird Advertisement
多颗线段树问题
维护一个有序数列{An},有三种操作:
1、添加一个元素。
2、删除一个元素。
3、求数列中下标%5 = 3的值的和。
线段树与其他结合练习(欢迎大家补充):
- hdu3954 Level up
- hdu4027 Can you answer these queries?
- hdu3333 Turing Tree
- hdu3874 Necklace
- hdu3016 Man Down
- hdu3340 Rain in ACStar
- zju3511 Cake Robbery
- UESTC1558 Charitable Exchange
- CF85-D Sum of Medians
- spojGSS2 Can you answer these queries II
- 顶
- 51
- 踩
- 1
参考知识库
-
.NET知识库
- 猜你在找
核心技术类目
- 文章搜索
- 文章分类
- 处理器Ambarella(1)
- 嵌入式Android(5)
- 嵌入式linux(20)
- STM32笔记(14)
- ACM回忆(47)
- MCU相关(27)
- 随笔 小记(2)
- 东西 小站(6)
- 文章存档
- 2016年07月(1)
- 2015年06月(1)
- 2015年05月(1)
- 2015年04月(3)
- 2015年03月(4)
- 阅读排行
- 数据结构专题——线段树(65567)
- 主席树介绍(26904)
- NE555 + CD4017流水灯(21772)
- Android蓝牙串口通信模板及demo,trick(17010)
- 两款主流摄像头OV7620与OV7670 By Demok(15269)
- 锁存器使用总结(9929)
- 各种音频视频编码方法(6842)
- D/A与A/D转换器(6457)
- STM32F407 Discovery uart1串口通信(6088)
- 基于51的爱心流水灯源码(5203)
- 评论排行
- 数据结构专题——线段树(40)
- 主席树介绍(14)
- Android蓝牙串口通信模板及demo,trick(11)
- 天马行空的ACM现场赛回顾(8)
- 51单片机进阶(6)
- 51单片机导论(6)
- STM32F051 IAP源码分享(6)
- 基于51的爱心流水灯源码(5)
- 基于RS485的简单现场总线通信系统设计-南邮自动化课程设计(4)
- C代码优化方案(4)
- 推荐文章
- * 程序员10月书讯,评论得书
- * Android中Xposed框架篇---修改系统位置信息实现自身隐藏功能
- * Chromium插件(Plugin)模块(Module)加载过程分析
- * Android TV开发总结--构建一个TV app的直播节目实例
- * 架构设计:系统存储--MySQL简单主从方案及暴露的问题
- 最新评论
- 数据结构专题——线段树
消磨时间: 请问,为什么要用四倍的空间。谢谢你。
- 主席树介绍
独立团团长李云龙: 至于么 应该是sublime或者是notepad++吧……此代码经检验有毒
- 数据结构专题——线段树
bighero4: 看明白了,那个build的例子,每个区间节点的value代表此区间(在数组array中是下标范围)上...
- 数据结构专题——线段树
bighero4: 把所有错误纠正一下吧。比如说:线段树并非完全二叉树。有些地方做一下解释,比如Build中的Value...
- 数据结构专题——线段树
Sci_M3: 模板一是有错的,顺便这个错就是您自己跑的样例的问题...
- 天马行空的ACM现场赛回顾
: good
- 基于RS485的简单现场总线通信系统设计-南邮自动化课程设计
njuptbd13: 博主有没有整个工程的报告书,渴求分享。
- 基于RS485的简单现场总线通信系统设计-南邮自动化课程设计
njuptbd13: 博主有没有基于RS485的简单现场总线通信系统设计的报告书
- STM32F051 IAP源码分享
dayunshixiong: 博主,发我整个工程可以吗,谢谢拉
MetalSeed
思绪来得快去的也快,偶尔会在这里停留。
数据结构专题——线段树
版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]
线段树
转载请注明出处,谢谢!http://blog.csdn.NET/metalseed/article/details/8039326
持续更新中···
一:线段树基本概念
1:概述
线段树,类似区间树,是一个完全二叉树,它在各个节点保存一条线段(数组中的一段子数组),主要用于高效解决连续区间的动态查询问题,由于二叉结构的特性,它基本能保持每个操作的复杂度为O(lgN)!
性质:父亲的区间是[a,b],(c=(a+b)/2)左儿子的区间是[a,c],右儿子的区间是[c+1,b],线段树需要的空间为数组大小的四倍
2:基本操作(demo用的是查询区间最小值)
线段树的主要操作有:
(1):线段树的构造 void build(int node, int begin, int end);
主要思想是递归构造,如果当前节点记录的区间只有一个值,则直接赋值,否则递归构造左右子树,最后回溯的时候给当前节点赋值
此build构造成的树如图:
(2):区间查询int query(int node, int begin, int end, int left, int right);
(其中node为当前查询节点,begin,end为当前节点存储的区间,left,right为此次query所要查询的区间)
主要思想是把所要查询的区间[a,b]划分为线段树上的节点,然后将这些节点代表的区间合并起来得到所需信息
比如前面一个图中所示的树,如果询问区间是[0,2],或者询问的区间是[3,3],不难直接找到对应的节点回答这一问题。但并不是所有的提问都这么容易回答,比如[0,3],就没有哪一个节点记录了这个区间的最小值。当然,解决方法也不难找到:把[0,2]和[3,3]两个区间(它们在整数意义上是相连的两个区间)的最小值“合并”起来,也就是求这两个最小值的最小值,就能求出[0,3]范围的最小值。同理,对于其他询问的区间,也都可以找到若干个相连的区间,合并后可以得到询问的区间。
可见,这样的过程一定选出了尽量少的区间,它们相连后正好涵盖了整个[left,right],没有重复也没有遗漏。同时,考虑到线段树上每层的节点最多会被选取2个,一共选取的节点数也是O(log n)的,因此查询的时间复杂度也是O(log n)。
线段树并不适合所有区间查询情况,它的使用条件是“相邻的区间的信息可以被合并成两个区间的并区间的信息”。即问题是可以被分解解决的。
(3):区间或节点的更新 及 线段树的动态维护update (这是线段树核心价值所在,节点中的标记域可以解决N多种问题)
动态维护需要用到标记域,延迟标记等。
a:单节点更新
b:区间更新(线段树中最有用的)
需要用到延迟标记,每个结点新增加一个标记,记录这个结点是否被进行了某种修改操作(这种修改操作会影响其子结点)。对于任意区间的修改,我们先按照查询的方式将其划分成线段树中的结点,然后修改这些结点的信息,并给这些结点标上代表这种修改操作的标记。在修改和查询的时候,如果我们到了一个结点p,并且决定考虑其子结点,那么我们就要看看结点p有没有标记,如果有,就要按照标记修改其子结点的信息,并且给子结点都标上相同的标记,同时消掉p的标记。(优点在于,不用将区间内的所有值都暴力更新,大大提高效率,因此区间更新是最优用的操作)
void Change来自dongxicheng.org
3:主要应用
(1):区间最值查询问题 (见模板1)
(2):连续区间修改或者单节点更新的动态查询问题 (见模板2)
(3):多维空间的动态查询 (见模板3)
二:典型模板
模板1:
RMQ,查询区间最值下标---min
模板2:
连续区间修改或者单节点更新的动态查询问题 (此模板查询区间和)
模板3:
多维空间的动态查询
三:练习题目
下面是hh线段树代码,典型练习哇~
在代码前先介绍一些我的线段树风格:
- maxn是题目给的最大区间,而节点数要开4倍,确切的来说节点数要开大于maxn的最小2x的两倍
- lson和rson分辨表示结点的左儿子和右儿子,由于每次传参数的时候都固定是这几个变量,所以可以用预定于比较方便的表示
- 以前的写法是另外开两个个数组记录每个结点所表示的区间,其实这个区间不必保存,一边算一边传下去就行,只需要写函数的时候多两个参数,结合lson和rson的预定义可以很方便
- PushUP(int rt)是把当前结点的信息更新到父结点
- PushDown(int rt)是把当前结点的信息更新给儿子结点
- rt表示当前子树的根(root),也就是当前所在的结点
整理这些题目后我觉得线段树的题目整体上可以分成以下四个部分:
单点更新:最最基础的线段树,只更新叶子节点,然后把信息用PushUP(int r)这个函数更新上来
- hdu1166 敌兵布阵
- 题意:O(-1)
- 思路:O(-1)
线段树功能:update:单点增减 query:区间求和
code:
hdu1754 I Hate It
题意:O(-1)
思路:O(-1)
线段树功能:update:单点替换 query:区间最值
hdu1394 Minimum Inversion Number
题意:求Inversion后的最小逆序数
思路:用O(nlogn)复杂度求出最初逆序数后,就可以用O(1)的复杂度分别递推出其他解
线段树功能:update:单点增减 query:区间求和
hdu2795 Billboard
题意:h*w的木板,放进一些1*L的物品,求每次放空间能容纳且最上边的位子
思路:每次找到最大值的位子,然后减去L
线段树功能:query:区间求最大值的位子(直接把update的操作在query里做了)
题意:O(-1)
思路:O(-1)
线段树功能:update:成段替换 (由于只query一次总区间,所以可以直接输出1结点的信息)
poj3468 A Simple Problem with Integers
题意:O(-1)
思路:O(-1)
线段树功能:update:成段增减 query:区间求和
poj2528 Mayor’s posters
题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报
思路:这题数据范围很大,直接搞超时+超内存,需要离散化:
离散化简单的来说就是只取我们需要的值来用,比如说区间[1000,2000],[1990,2012] 我们用不到[-∞,999][1001,1989][1991,1999][2001,2011][2013,+∞]这些值,所以我只需要1000,1990,2000,2012就够了,将其分别映射到0,1,2,3,在于复杂度就大大的降下来了
所以离散化要保存所有需要用到的值,排序后,分别映射到1~n,这样复杂度就会小很多很多
而这题的难点在于每个数字其实表示的是一个单位长度(并非一个点),这样普通的离散化会造成许多错误(包括我以前的代码,poj这题数据奇弱)
给出下面两个简单的例子应该能体现普通离散化的缺陷:
例子一:1-10 1-4 5-10
例子二:1-10 1-4 6-10
普通离散化后都变成了[1,4][1,2][3,4]
线段2覆盖了[1,2],线段3覆盖了[3,4],那么线段1是否被完全覆盖掉了呢?
例子一是完全被覆盖掉了,而例子二没有被覆盖
为了解决这种缺陷,我们可以在排序后的数组上加些处理,比如说[1,2,6,10]
如果相邻数字间距大于1的话,在其中加上任意一个数字,比如加成[1,2,3,6,7,10],然后再做线段树就好了.
线段树功能:update:成段替换 query:简单hash
poj3225 Help with Intervals
题意:区间操作,交,并,补等
思路:
我们一个一个操作来分析:(用0和1表示是否包含区间,-1表示该区间内既有包含又有不包含)
U:把区间[l,r]覆盖成1
I:把[-∞,l)(r,∞]覆盖成0
D:把区间[l,r]覆盖成0
C:把[-∞,l)(r,∞]覆盖成0 , 且[l,r]区间0/1互换
S:[l,r]区间0/1互换
成段覆盖的操作很简单,比较特殊的就是区间0/1互换这个操作,我们可以称之为异或操作
很明显我们可以知道这个性质:当一个区间被覆盖后,不管之前有没有异或标记都没有意义了
所以当一个节点得到覆盖标记时把异或标记清空
而当一个节点得到异或标记的时候,先判断覆盖标记,如果是0或1,直接改变一下覆盖标记,不然的话改变异或标记
开区间闭区间只要数字乘以2就可以处理(偶数表示端点,奇数表示两端点间的区间)
线段树功能:update:成段替换,区间异或 query:简单hash
poj1436 Horizontally Visible Segments
poj2991 Crane
Another LCIS
Bracket Sequence
区间合并
题意:1 a:询问是不是有连续长度为a的空房间,有的话住进最左边
2 a b:将[a,a+b-1]的房间清空
思路:记录区间中最长的空房间
线段树操作:update:区间替换 query:询问满足条件的最左断点
练习
hdu3308 LCIS
hdu3397 Sequence operation
hdu2871 Memory Control
hdu1540 Tunnel Warfare
CF46-D Parking Lot
题意:矩形面积并
思路:浮点数先要离散化;然后把矩形分成两条边,上边和下边,对横轴建树,然后从下到上扫描上去,用cnt表示该区间下边比上边多几个,sum代表该区间内被覆盖的线段的长度总和
这里线段树的一个结点并非是线段的一个端点,而是该端点和下一个端点间的线段,所以题目中r+1,r-1的地方可以自己好好的琢磨一下
题意:矩形周长并
思路:与面积不同的地方是还要记录竖的边有几个(numseg记录),并且当边界重合的时候需要合并(用lbd和rbd表示边界来辅助)
线段树操作:update:区间增减 query:直接取根节点的值
练习
hdu3265 Posters
hdu3642 Get The Treasury
poj2482 Stars in Your Window
poj2464 Brownie Points II
hdu3255 Farming
ural1707 Hypnotoad’s Secret
uva11983 Weird Advertisement
多颗线段树问题
维护一个有序数列{An},有三种操作:
1、添加一个元素。
2、删除一个元素。
3、求数列中下标%5 = 3的值的和。
线段树与其他结合练习(欢迎大家补充):
- hdu3954 Level up
- hdu4027 Can you answer these queries?
- hdu3333 Turing Tree
- hdu3874 Necklace
- hdu3016 Man Down
- hdu3340 Rain in ACStar
- zju3511 Cake Robbery
- UESTC1558 Charitable Exchange
- CF85-D Sum of Medians
- spojGSS2 Can you answer these queries II
- 顶
- 51
- 踩
- 1
参考知识库
-
.NET知识库
- 猜你在找
- 26楼 消磨时间 2016-08-10 16:19发表 [回复]
- 请问,为什么要用四倍的空间。谢谢你。
- 25楼 bighero4 2016-06-26 21:26发表 [回复]
- 看明白了,那个build的例子,每个区间节点的value代表此区间(在数组array中是下标范围)上的的数组array的最小值。
- 24楼 bighero4 2016-06-26 21:15发表 [回复]
- 把所有错误纠正一下吧。比如说:线段树并非完全二叉树。
有些地方做一下解释,比如Build中的Value是什么意思?
- 23楼 Sci_M3 2016-06-08 11:42发表 [回复]
- 模板一是有错的,顺便这个错就是您自己跑的样例的问题...
- 22楼 zlqdhrdhrdhr 2015-11-29 09:27发表 [回复]
- 博主第3块代码有个小错误
那个left跟right应该是begin和end吧 ^_^- Re: wyj__jenny 2016-02-04 11:39发表 [回复]
- 回复zlqdhrdhrdhr:同意
- 21楼 清风小竹 2015-11-03 16:12发表 [回复]
- 楼主的博客写的很好!赞一个
- 20楼 liangshanxiaohan 2015-10-28 21:01发表 [回复]
- 楼主你好,我想请问一下,你是否接触过range tree,能不能给一段range tree建树的代码
- 19楼 Lormons 2015-09-27 11:43发表 [回复]
- 不是完全二叉树吧...~~
- 18楼 LuckyqXd 2015-08-22 23:22发表 [回复]
- 线段树可以不为完全二叉树。。。。
- 17楼 bestcoder_judge 2015-08-21 15:44发表 [回复]
- 不错不错,线段树估计你没问题了!
- 16楼 Triangle_libing 2015-08-12 10:28发表 [回复]
- 这跟编译器有什么关系
- 15楼 Anger_Coder 2015-07-03 18:46发表 [回复]
- 有一个点需要注意,mid的求法,不要(begin+end)/2这个会溢出,要begin + (end - begin) >> 1 这样比较好
- Re: glassMonster 2015-11-17 19:15发表 [回复]
- 回复Anger_Coder:不过需要注意一点,移位运算符的优先级低,在这里就比“+”低,最后的结果就是end>>1,会使程序运行出错,所以最好再加括号begin+((end-begin)>>1)
- 14楼 小飞哇咔咔 2015-04-01 12:01发表 [回复]
- mark
- 13楼 ouweiqi 2015-03-30 11:13发表 [回复]
- 错误百出,还好意思贴出来
- Re: Echizens 2015-08-20 15:16发表 [回复]
- 回复ouweiqi:至少人家很谦虚。所以有意见提出来,不要BB。
- 12楼 楼上小宇 2015-01-27 23:43发表 [回复]
- 受教了。。。很详细
- 11楼 MetalSeed 2014-11-12 16:09发表 [回复]
- 228003430
- 10楼 累了泪了funny 2014-07-25 20:53发表 [回复]
- 为什么都不喜欢定义结构体呢,表示用数组模拟,看不懂,不要嘲笑我,我是菜鸟
- Re: MetalSeed 2014-11-07 09:46发表 [回复]
- 回复u011422701:那个时候强迫症,数组写起来方便一些,速度稍微快一点
- 9楼 MetalSeed 2013-01-01 23:50发表 [回复]
- http://blog.csdn.net/shiqi_614/article/details/8228102
- 8楼 GodHunter47 2012-12-31 15:16发表 [回复]
- 弱弱的屌丝一枚,不过勉为其难的给你顶一下
- Re: MetalSeed 2013-01-01 23:47发表 [回复]
- 回复GodHunter47:```` ~~ 呼呼 谢谢大神
- 7楼 Zr777111 2012-10-12 15:11发表 [回复]
- 高深。。。
- 6楼 wd339092886 2012-10-12 14:09发表 [回复]
- 不行不行,我还是倾向于编程。。
- 5楼 dyx心心 2012-10-12 11:32发表 [回复]
- 楼主是搞ACM的?
- Re: MetalSeed 2012-10-12 23:38发表 [回复]
- 回复dyx404514:ACM弱菜一枚.. 正在努力中..
- Re: dyx心心 2012-11-19 09:37发表 [回复]
- 回复MetalSeed:我感觉最后那道题,hdu4267那个sum就是个标记而已,不需要
L[step].sum+=num; 只要 L[step].sum=1,就行了吧
- 回复MetalSeed:我感觉最后那道题,hdu4267那个sum就是个标记而已,不需要
- 回复dyx404514:ACM弱菜一枚.. 正在努力中..
- 4楼 c_006 2012-10-11 11:31发表 [回复]
- mark一下。楼主的编译软件是什么的?这么花花绿绿的vs2010?
- Re: mz31098 2015-08-22 03:10发表 [回复]
- 回复c_006:看着像sublime
- Re: hellosijian 2012-10-11 19:46发表 [回复]
- 回复c_006:应该是vim
- Re: hello_world_ww 2013-01-26 09:34发表 [回复]
- 回复hellosijian:GCC/G++
- 3楼 jiangkaii 2012-10-11 07:32发表 [回复]
- 进首页了!!
- Re: MetalSeed 2012-10-11 10:51发表 [回复]
- 回复jiangkaii:是蒋凯么。。。
- Re: jiangkaii 2012-10-12 01:51发表 [回复]
- 回复MetalSeed:是的,
- 回复jiangkaii:是蒋凯么。。。
- 2楼 pl___ 2012-10-09 16:16发表 [回复]
- 手动实现std::map ?
- Re: MetalSeed 2012-10-09 17:36发表 [回复]
- 回复pl___:非也。
map是用红黑树实现的,特点是插入时按照键值自动排序
- 回复pl___:非也。
- 1楼 Dstnoe 2012-10-08 23:22发表 [回复]
- 请问,线段树和B树在应用上有什么特别之处?
- Re: MetalSeed 2012-10-09 17:38发表 [回复]
- 回复d1x2p3:不好意思..
B树只有耳闻...
没详细研究过...
还得努力呢
- 回复d1x2p3:不好意思..
核心技术类目
- 文章搜索
- 文章分类
- 处理器Ambarella(1)
- 嵌入式Android(5)
- 嵌入式linux(20)
- STM32笔记(14)
- ACM回忆(47)
- MCU相关(27)
- 随笔 小记(2)
- 东西 小站(6)
- 文章存档
- 2016年07月(1)
- 2015年06月(1)
- 2015年05月(1)
- 2015年04月(3)
- 2015年03月(4)
- 阅读排行
- 数据结构专题——线段树(65567)
- 主席树介绍(26904)
- NE555 + CD4017流水灯(21772)
- Android蓝牙串口通信模板及demo,trick(17010)
- 两款主流摄像头OV7620与OV7670 By Demok(15269)
- 锁存器使用总结(9929)
- 各种音频视频编码方法(6842)
- D/A与A/D转换器(6457)
- STM32F407 Discovery uart1串口通信(6088)
- 基于51的爱心流水灯源码(5203)
- 评论排行
- 数据结构专题——线段树(40)
- 主席树介绍(14)
- Android蓝牙串口通信模板及demo,trick(11)
- 天马行空的ACM现场赛回顾(8)
- 51单片机进阶(6)
- 51单片机导论(6)
- STM32F051 IAP源码分享(6)
- 基于51的爱心流水灯源码(5)
- 基于RS485的简单现场总线通信系统设计-南邮自动化课程设计(4)
- C代码优化方案(4)
- 推荐文章
- * 程序员10月书讯,评论得书
- * Android中Xposed框架篇---修改系统位置信息实现自身隐藏功能
- * Chromium插件(Plugin)模块(Module)加载过程分析
- * Android TV开发总结--构建一个TV app的直播节目实例
- * 架构设计:系统存储--MySQL简单主从方案及暴露的问题
- 最新评论
- 数据结构专题——线段树
消磨时间: 请问,为什么要用四倍的空间。谢谢你。
- 主席树介绍
独立团团长李云龙: 至于么 应该是sublime或者是notepad++吧……此代码经检验有毒
- 数据结构专题——线段树
bighero4: 看明白了,那个build的例子,每个区间节点的value代表此区间(在数组array中是下标范围)上...
- 数据结构专题——线段树
bighero4: 把所有错误纠正一下吧。比如说:线段树并非完全二叉树。有些地方做一下解释,比如Build中的Value...
- 数据结构专题——线段树
Sci_M3: 模板一是有错的,顺便这个错就是您自己跑的样例的问题...
- 天马行空的ACM现场赛回顾
: good
- 基于RS485的简单现场总线通信系统设计-南邮自动化课程设计
njuptbd13: 博主有没有整个工程的报告书,渴求分享。
- 基于RS485的简单现场总线通信系统设计-南邮自动化课程设计
njuptbd13: 博主有没有基于RS485的简单现场总线通信系统设计的报告书
- STM32F051 IAP源码分享
dayunshixiong: 博主,发我整个工程可以吗,谢谢拉
26楼 消磨时间 2016-08-10 16:19发表 [回复]- 请问,为什么要用四倍的空间。谢谢你。
25楼 bighero4 2016-06-26 21:26发表 [回复]- 看明白了,那个build的例子,每个区间节点的value代表此区间(在数组array中是下标范围)上的的数组array的最小值。
24楼 bighero4 2016-06-26 21:15发表 [回复]- 把所有错误纠正一下吧。比如说:线段树并非完全二叉树。
有些地方做一下解释,比如Build中的Value是什么意思?
23楼 Sci_M3 2016-06-08 11:42发表 [回复]- 模板一是有错的,顺便这个错就是您自己跑的样例的问题...
22楼 zlqdhrdhrdhr 2015-11-29 09:27发表 [回复]- 博主第3块代码有个小错误
那个left跟right应该是begin和end吧 ^_^
Re: wyj__jenny 2016-02-04 11:39发表 [回复]- 回复zlqdhrdhrdhr:同意
21楼 清风小竹 2015-11-03 16:12发表 [回复]- 楼主的博客写的很好!赞一个
20楼 liangshanxiaohan 2015-10-28 21:01发表 [回复]- 楼主你好,我想请问一下,你是否接触过range tree,能不能给一段range tree建树的代码
19楼 Lormons 2015-09-27 11:43发表 [回复]- 不是完全二叉树吧...~~
18楼 LuckyqXd 2015-08-22 23:22发表 [回复]- 线段树可以不为完全二叉树。。。。
17楼 bestcoder_judge 2015-08-21 15:44发表 [回复]- 不错不错,线段树估计你没问题了!
16楼 Triangle_libing 2015-08-12 10:28发表 [回复]- 这跟编译器有什么关系
15楼 Anger_Coder 2015-07-03 18:46发表 [回复]- 有一个点需要注意,mid的求法,不要(begin+end)/2这个会溢出,要begin + (end - begin) >> 1 这样比较好
Re: glassMonster 2015-11-17 19:15发表 [回复]- 回复Anger_Coder:不过需要注意一点,移位运算符的优先级低,在这里就比“+”低,最后的结果就是end>>1,会使程序运行出错,所以最好再加括号begin+((end-begin)>>1)
14楼 小飞哇咔咔 2015-04-01 12:01发表 [回复]- mark
13楼 ouweiqi 2015-03-30 11:13发表 [回复]- 错误百出,还好意思贴出来
Re: Echizens 2015-08-20 15:16发表 [回复]- 回复ouweiqi:至少人家很谦虚。所以有意见提出来,不要BB。
12楼 楼上小宇 2015-01-27 23:43发表 [回复]- 受教了。。。很详细
11楼 MetalSeed 2014-11-12 16:09发表 [回复]- 228003430
10楼 累了泪了funny 2014-07-25 20:53发表 [回复]- 为什么都不喜欢定义结构体呢,表示用数组模拟,看不懂,不要嘲笑我,我是菜鸟
Re: MetalSeed 2014-11-07 09:46发表 [回复]- 回复u011422701:那个时候强迫症,数组写起来方便一些,速度稍微快一点
9楼 MetalSeed 2013-01-01 23:50发表 [回复]- http://blog.csdn.net/shiqi_614/article/details/8228102
8楼 GodHunter47 2012-12-31 15:16发表 [回复]- 弱弱的屌丝一枚,不过勉为其难的给你顶一下
Re: MetalSeed 2013-01-01 23:47发表 [回复]- 回复GodHunter47:```` ~~ 呼呼 谢谢大神
7楼 Zr777111 2012-10-12 15:11发表 [回复]- 高深。。。
6楼 wd339092886 2012-10-12 14:09发表 [回复]- 不行不行,我还是倾向于编程。。
5楼 dyx心心 2012-10-12 11:32发表 [回复]- 楼主是搞ACM的?
Re: MetalSeed 2012-10-12 23:38发表 [回复]- 回复dyx404514:ACM弱菜一枚.. 正在努力中..
Re: dyx心心 2012-11-19 09:37发表 [回复]- 回复MetalSeed:我感觉最后那道题,hdu4267那个sum就是个标记而已,不需要
L[step].sum+=num; 只要 L[step].sum=1,就行了吧
4楼 c_006 2012-10-11 11:31发表 [回复]- mark一下。楼主的编译软件是什么的?这么花花绿绿的vs2010?
Re: mz31098 2015-08-22 03:10发表 [回复]- 回复c_006:看着像sublime
Re: hellosijian 2012-10-11 19:46发表 [回复]- 回复c_006:应该是vim
Re: hello_world_ww 2013-01-26 09:34发表 [回复]- 回复hellosijian:GCC/G++
3楼 jiangkaii 2012-10-11 07:32发表 [回复]- 进首页了!!
Re: MetalSeed 2012-10-11 10:51发表 [回复]- 回复jiangkaii:是蒋凯么。。。
Re: jiangkaii 2012-10-12 01:51发表 [回复]- 回复MetalSeed:是的,
2楼 pl___ 2012-10-09 16:16发表 [回复]- 手动实现std::map ?
Re: MetalSeed 2012-10-09 17:36发表 [回复]- 回复pl___:非也。
map是用红黑树实现的,特点是插入时按照键值自动排序
1楼 Dstnoe 2012-10-08 23:22发表 [回复]- 请问,线段树和B树在应用上有什么特别之处?
Re: MetalSeed 2012-10-09 17:38发表 [回复]- 回复d1x2p3:不好意思..
B树只有耳闻...
没详细研究过...
还得努力呢