线段树 (Segment Tree) 模板详解

线段树 (Segment Tree) 模板详解
靖线段树 (Segment Tree) 模板详解
1. 简介
线段树是一种用于处理区间查询和修改操作的树形数据结构。它能够在 O(log n) 的时间复杂度内完成单点修改和区间查询操作。本模板采用了模板编程的方式,支持自定义信息类型,实现了灵活且高效的区间操作。
主要特点:
- 支持自定义信息类型和合并操作
- 单点修改时间复杂度 O(log n)
- 区间查询时间复杂度 O(log n)
- 支持区间第一个/最后一个满足条件的位置查询
2. 实现原理
2.1 基本结构
线段树的核心是将区间划分为多个子区间:
- 每个节点代表一个区间
- 左右子节点分别代表区间的左右半部分
- 叶子节点代表单个元素
2.2 核心策略
信息合并:
- 通过自定义的 Info 类型实现信息的存储
- 使用运算符重载
operator+
定义区间信息的合并方式
区间管理:
- 使用完全二叉树存储区间信息
- 动态维护区间信息的更新和查询
二分策略:
- 利用二分思想处理区间查询
- 实现查找第一个/最后一个满足条件的位置
3. 模板代码
1 | template<class Info> |
4. 函数说明
4.1 构造和初始化
1 | SegmentTree() |
- 支持默认构造、大小初始化和数组初始化
- 可以指定初始值类型和默认值
4.2 核心操作
1 | void modify(int p, const Info &v) |
modify
: 单点修改rangeQuery
: 区间查询findFirst/findLast
: 查找满足条件的位置
5. 时间复杂度分析
初始化:O(n)
- 建树过程:O(n)
- 空间分配:O(n)
核心操作:O(log n)
- 单点修改:O(log n)
- 区间查询:O(log n)
- 条件查找:O(log n)
空间复杂度:O(n)
- 使用数组存储完全二叉树
6. 应用场景
- 区间求和/最值问题
- 区间统计查询
- 动态维护序列信息
- 区间更新和查询
- 在线处理区间操作
7. 使用示例
7.1 区间求和
1 | struct Sum { |
7.2 区间最值
1 | struct Max { |
8. 注意事项
- Info 类型必须定义 operator+ 运算符
- 查询区间为左闭右开 [l, r)
- 修改操作会自动维护祖先节点信息
- 初始化时需要合理估计空间大小
9. 总结
线段树是一个强大而灵活的数据结构,通过合理的设计可以解决多种区间查询和修改问题。本模板通过模板编程的方式提供了高度的可定制性,同时保持了优秀的性能表现。
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果