线段树的优点:
O(logn)时间内,在一段区间中求最大最小值
线段树的特征:
- 二叉树
- 每个节点表示一个区间的最大值
- 左儿子 = 平分后左区间,右儿子 = 平分后右区间
- 不可增减节点(线段数结点总数需要在最开始就给定)
- 空间复杂度: O(n)
线段树的操作:
线段树的查询: O(logn)
- 查询的区间 和 线段树节点区间 相等 -> 直接返回
- 查询的区间 被 线段树节点区间 包含-> 递归向下搜索左右子树
- 查询的区间 和 线段树节点区间 不相交 -> 结束
- 查询的区间 和 线段树节点区间 相交且不相等 -> 分裂查询区间
线段树的建立: O(n)
- 自上而下递归分裂
- 自下而上回溯更新
线段树的更新: O(logn)
- 自上而下递归查询
- 自下而上回溯更新
问题特征:
- 对区间求sum
- 对区间求Max/Min
- 对区间求Count
构建形式
- 下标作为建立区间
- 值作为建立区间
【参考】:
http://codeforces.com/blog/entry/18051