线段树Segment tree
Posted radestionadtinium
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线段树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等同于i2+1
以上是关于线段树Segment tree的主要内容,如果未能解决你的问题,请参考以下文章