【清明】线段树

来源:互联网 发布:mac的ps和windows 编辑:程序博客网 时间:2024/06/11 17:47

树形数据结构//废话
这里说普通线段树,并不包括zkw线段树
变体点树之类的也不涉及了

线段树是平衡二叉树
支持区间/单点查询,区间/单点修改
时间复杂度为O(logN)
空间复杂度2N
所以有时候需要离散化压空间√

图片来自百度百科
图片来自百度百科
线段树嘛顾名思义就好
每个线段被层层分解,端点便是区间边界
然后就可以搞事情><

要注意节点编号和线段端点是两个概念
对于编号为n的节点,左儿子是2n,右儿子是2n+1
相当好用的性质

和图上一样,一层一层的树
修改的话一层一层是不是很麻烦?
所以有了lazy标记
lazy,懒惰,也就是给修改的区间打一个标记,证明我想修改它
标记是给儿子用的,什么时候用到了,什么时候标记下放给儿子们
下放时分左右两部分,二分思想

线段树是相当好用的数据结构
就是写起来好像有点长

代码模板点这里↓
http://blog.csdn.net/Loi_Shirley/article/details/51988188

其他的修改类型,比如开根啊什么的,记住下放标记就好
适用类型一般比较明显,看数据范围&&满足区间加法
就是多次动态查询&&修改的题
比如行星序列和宠物收纳所,之类的
//静态的RMQ就行。。

区间操作必须是连续区间
不然的话就不是一次操作能解决的事情了

拓展一个叫做二维线段树的东西
前面说的就是一维线段树,针对线段
二维就变成了矩形
比如这样
这里写图片描述
或者这样
这里写图片描述

第一种是将整棵树看成矩形的
第二种是树里套树
第一种更简单然而第二种复杂度更优

空间复杂度都是O(2*Long_x*Long_y)
时间复杂度:
第一种O(4*Long_x*Long_y)
第二种O(n*Long_x)

这是个四分思想
查询的相应变成矩形面积(矩形和

多维的可以仿照二维
2n分思想构造2n叉树

0 0
原创粉丝点击