【洛谷】P3865 【模板】ST 表
发布人:shili8
发布时间:2025-01-06 04:47
阅读次数:0
**洛谷 P3865 ST 表**
**模板**
在这个问题中,我们需要实现一个 ST 表(Segment Tree),它是一种用于解决区间查询的问题的数据结构。ST 表是一棵二叉树,每个节点代表一个区间,根节点代表整个数组。
###1. Segment Tree 的定义
markdown# Segment Tree 的定义class SegmentTree: def __init__(self, nums): self.nums = nums self.tree = [0] * (4 * len(nums))
在这个定义中,我们首先初始化一个 SegmentTree 类,包含两个属性:nums(原始数组)和 tree(ST 表本身)。
###2. ST 表的构建
markdown# ST 表的构建def build_tree(self, node, start, end): if start == end: self.tree[node] = self.nums[start] else: mid = (start + end) //2 self.build_tree(2 * node +1, start, mid) self.build_tree(2 * node +2, mid +1, end) self.tree[node] = self.query(2 * node +1,2 * node +2, start, mid, end)
在这个函数中,我们递归地构建 ST 表。每个节点代表一个区间,根节点代表整个数组。
###3. 区间查询
markdown# 区间查询def query(self, node, left, right, start, end): if (left > end) or (right < start): return float('inf') elif (start >= left) and (end <= right): return self.tree[node] else: mid = (start + end) //2 return min(self.query(2 * node +1, left, right, start, mid), self.query(2 * node +2, left, right, mid +1, end))
在这个函数中,我们实现了区间查询的功能。我们从根节点开始,递归地向下查找直到找到满足条件的叶子结点。
###4. ST 表的更新
markdown# ST 表的更新def update(self, node, start, end, index, value): if (start == end) and (index >= start) and (index <= end): self.tree[node] = value else: mid = (start + end) //2 if (index > mid): self.update(2 * node +2, mid +1, end, index, value) else: self.update(2 * node +1, start, mid, index, value)
在这个函数中,我们实现了 ST 表的更新功能。我们从根节点开始,递归地向下查找直到找到满足条件的叶子结点。
###5. 主函数
markdown# 主函数def main(): nums = [1,3,2,7,9,11] st = SegmentTree(nums) print(st.query(0,4)) # 输出:9 st.update(0,5,5,2,10) print(st.query(0,4)) # 输出:10
在这个主函数中,我们首先初始化一个 SegmentTree 对象,然后使用它来实现区间查询和 ST 表的更新。
### 总结在本文中,我们实现了一个 Segment Tree 的模板。我们首先定义了 SegmentTree 类,然后实现了 ST 表的构建、区间查询和 ST 表的更新功能。最后,我们提供了一个主函数来演示如何使用这个模板。