当前位置:实例文章 » 其他实例» [文章]【洛谷】P3865 【模板】ST 表

【洛谷】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 表的更新功能。最后,我们提供了一个主函数来演示如何使用这个模板。

相关标签:
其他信息

其他资源

Top