线段树Segment tree

申明:之前是因为线段树一点都不懂才学字典树的,现在学线段树

所以这篇文章在前大部分时间都是写给我自己看的——给一个初学数据结构的蒟蒻我学的

首先,看看度娘是怎么定义线段树的

线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点
使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)
而未优化的空间复杂度为2N,实际应用时一般还要开4N的数组以免越界,因此有时需要离散化让空间压缩

所以,线段树就是长得这个亚子(度娘的图):

那至于为什么要开4倍空间呢?

我也不大清楚,可以写个程序看一下,发现2倍,3倍空间都会越界

只要记得开4倍就好了qwq

然后就是建树了qwq

二叉树的特性:每个标号为i的父节点,他的左儿子编号是i2,右儿子编号是i2+1

所以便可以写出求左儿子和右儿子的函数啦qwq:

int n,ans[N<<2];
inline int ls(int i){return i<<1;}//左儿子
inline int rs(int i){return i<<1|1;}//右儿子

上面函数里写的是二进制运算,i<<1就相当于i2
至于i<<1|1,因为当前已经乘2,二进制末尾必然是0(不了解可以bfs qwq),而|1就相当于+1
所以i<<1|1等同于i
2+1

猜你喜欢

转载自www.cnblogs.com/RadestionAdtinium/p/13170710.html