[PKU暑课笔记] 趁机膜一发线段树和树状数组
2017-08-07 17:02
225 查看
一●线段树 Interval Tree(区间树)
●线段树的基本用途
线段树适用于和区间统计有关的问题。
比如某些数据可以按区间进行划分,按区间动态进行修改,以及需要按区间多次进行查询
树:一棵二叉树
线段:树上的每个节点对应于一个线段(区间)[a,b](区间的起点和终点通常为整数)
同一层的节点所代表的区间,相互不会重叠,且加起来是个连续的区间。
每一个叶子节点表示了一个单位区间(长度为1)(每个区间的长度是区间内整数的个数),不能再分。
对于每一个非叶结点所表示的结点[a,b],其左儿子表示的区间为
[a,(a+b)/2],右儿子表示的区间为 [(a+b)/2+1,b](除法去尾取整)
●区间[1,9]的线段树
1、线段树的平分构造,实际上是用了二分的方法。
2、若根节点对应的区间是[a,b],那么它的深度为log2(b-a+1) +1 (向上取整)。
3、叶子节点的数目和根节点表示区间的长度相同。
4、线段树节点要么0度,要么2度, 因此若叶子节点数目为N, 则线段树总结点数目为2N-1
●区间的分解
规则:如果有某个节点代表的区间, 完全属于待分解区间,则该节点为“终止” 节点,不再继续往下分解
所有“终止”节点所代表的区间都不重叠,且加在一起就恰好等于整个待分解区间
eg.区间[1, 9]的线段树上,区间[2,8]的分解
●线段树的特征
1、线段树的深度不超过log2(n)+1(向上取整,n是根节点 对应区间的长度)
2、线段树上,任意一个区间被分解后得到的“终止节点”数目都是log(n)量级
3、线段树上更新叶子节点和进行区间分解时间复杂度都是O(log(n))
●线段树的构建
●例题
给你一个数的序列A1A2……An。 并且可能多次进行下列两个操作:
1、对序列里面的某个数进行加减
2、询问这个序列里面任意一个连续的子序列Ai,Ai+1……Aj的和是多少
分析:
显然,[1,n]就是根节点对应的区间
可以在每个节点记录该节点对应的区间里面的数的和Sum。
对于操作1:因为序列里面Ai最多只会被线段 树的log(n)个节点覆盖。只要求对线段树覆盖 Ai的节点的Sum进行加操作,因此复杂度是 log(n)
对于操作2:同样只需要找到区间所覆盖的“ 终止”节点,然后把所找“终止”节点的Sum 累加起来。因为这些节点的数量是O(log(n)) 的,所以这一步的复杂度也是log(n)
●线段树的基本用途
线段树适用于和区间统计有关的问题。
比如某些数据可以按区间进行划分,按区间动态进行修改,以及需要按区间多次进行查询
树:一棵二叉树
线段:树上的每个节点对应于一个线段(区间)[a,b](区间的起点和终点通常为整数)
同一层的节点所代表的区间,相互不会重叠,且加起来是个连续的区间。
每一个叶子节点表示了一个单位区间(长度为1)(每个区间的长度是区间内整数的个数),不能再分。
对于每一个非叶结点所表示的结点[a,b],其左儿子表示的区间为
[a,(a+b)/2],右儿子表示的区间为 [(a+b)/2+1,b](除法去尾取整)
●区间[1,9]的线段树
1、线段树的平分构造,实际上是用了二分的方法。
2、若根节点对应的区间是[a,b],那么它的深度为log2(b-a+1) +1 (向上取整)。
3、叶子节点的数目和根节点表示区间的长度相同。
4、线段树节点要么0度,要么2度, 因此若叶子节点数目为N, 则线段树总结点数目为2N-1
●区间的分解
规则:如果有某个节点代表的区间, 完全属于待分解区间,则该节点为“终止” 节点,不再继续往下分解
所有“终止”节点所代表的区间都不重叠,且加在一起就恰好等于整个待分解区间
eg.区间[1, 9]的线段树上,区间[2,8]的分解
●线段树的特征
1、线段树的深度不超过log2(n)+1(向上取整,n是根节点 对应区间的长度)
2、线段树上,任意一个区间被分解后得到的“终止节点”数目都是log(n)量级
3、线段树上更新叶子节点和进行区间分解时间复杂度都是O(log(n))
●线段树的构建
function //以节点v为根建树,v对应区间为[l,r] { 对节点v初始化 if(l!=r) { 以v的左孩子为根建树,区间为[l,(l+r)/2]; 以v的右孩子为根建树,区间为[(l+r)/2+1,r]; } } //建树的时间复杂度是O(n),n为根节点对应的区间长度
●例题
给你一个数的序列A1A2……An。 并且可能多次进行下列两个操作:
1、对序列里面的某个数进行加减
2、询问这个序列里面任意一个连续的子序列Ai,Ai+1……Aj的和是多少
分析:
显然,[1,n]就是根节点对应的区间
可以在每个节点记录该节点对应的区间里面的数的和Sum。
对于操作1:因为序列里面Ai最多只会被线段 树的log(n)个节点覆盖。只要求对线段树覆盖 Ai的节点的Sum进行加操作,因此复杂度是 log(n)
对于操作2:同样只需要找到区间所覆盖的“ 终止”节点,然后把所找“终止”节点的Sum 累加起来。因为这些节点的数量是O(log(n)) 的,所以这一步的复杂度也是log(n)
相关文章推荐
- [Pku 2352 2155 Hdu 3584] 线段树(五) {树状数组}
- pku 暑假培训1 线段树和树状数组
- [NOJ 1060] Countless Core Computers (线段树 or 树状数组)
- 【线段树】PKU2777 区间更新区间询问(位优化)
- [PKU] 2777 Count Color -- 线段树
- HDU 5775 Bubble Sort (树状数组或线段树)
- PKU3067 Japan - 树状数组
- HDU 1541 Stars (线段树||树状数组)
- 敌兵布阵 【线段树 or 树状数组 区间求和】
- HDU 4046 Panda(RMQ 线段树 树状数组)
- CodeForces - 668D Little Artem and Time Machine(线段树||树状数组)
- PKU 2528 Mayor's posters离散的线段树
- PKU C++程序设计实习 学习笔记1
- [PKU 3468] 线段树(三) {Lazy-Tag思想}
- 线段树 区域覆盖模版题 pku 3468 A Simple Problem with Integers 线段树——成段操作
- [树状数组套权值线段树] BZOJ 1901 Zju2112 Dynamic Rankings
- HDU 1754 I Hate It (线段树 & 树状数组)
- 树状数组学习笔记
- hdu 1166敌兵布阵 线段树 树状数组
- pku 2777 Count Color(线段树变形)