最近做了好几题线段树的题目,
对线段树也有了更深的了解.
线段树概念:
线段树是建立在线段的基础上,每个结点都代表了一条线段[a , b]。长度为1的线段称为元线段。非元线段都有两个子结点,左结点代表的线段为[a , (a + b ) / 2],右结点代表的线段为[( a + b ) / 2 , b]。
线段树结构如下:
包含左右边界(范围)值,
其他的节点信息则视具体题目而定,
这也是线段树精华之所在,
根据不同的题目, 在节点中增加不同的信息,
然后动态的维护/查询.
一般线段树包含下面3个操作:
(1).built: 建树
(2).update: 更新
(3).find: 查询
(4).insert: 插入
(5).delete: 删除
由线段树的定义可知, 线段树其实就是一颗完全二叉树,
所以建树时间复杂度为O(n), 其他操作的时间复杂度均O(Log n).
练习:
poj 2777 Count Color
http://poj.org/problem?id=2777
注意更新操作.
poj 3468 A Simple Problem with Integers
http://poj.org/problem?id=3468
注意下数值的取值范围就好了.
poj 3277 City Horizon
http://poj.org/problem?id=3277
(1 ≤ Ai < Bi ≤ 1,000,000,000)所以需要离散化,
离散化的方法是: 把所有A,B的值先剔重然后排序, 将排序后的1-N个数映射到线段树中.
ps: 貌似这题数组要开4倍以上, 我开4倍RE了.....
poj 2832 Sliding Window
http://poj.org/problem?id=2823
ps: 跑了7469MS, 囧
其他的题目:poj2828 poj2812.....