📜  迭代段树(范围最小查询)(1)

📅  最后修改于: 2023-12-03 14:57:58.388000             🧑  作者: Mango

迭代段树(范围最小查询)

什么是迭代段树?

迭代段树是一种常见的数据结构操作之一,主要用于处理线段树的一些问题。与递归段树不同,迭代段树使用迭代方式来实现,更加简洁高效。

如何使用迭代段树?
构建迭代段树

假设我们需要处理一段区间 $[L, R]$,可按照以下步骤构建迭代段树:

  1. 创建一个叶子节点,表示区间 $[L, R]$;
  2. 如果当前区间 $[l, r]$ 大于 $[L, R]$,则将当前节点标记为无效;
  3. 如果当前区间 $[l, r]$ 包含于 $[L, R]$,则将当前节点的值设置为区间 $[l, r]$ 的最小值,并返回节点;
  4. 如果当前区间与 $[L, R]$ 有交集,则递归构建左右子树,并返回节点。

下面是用 Python 实现构建迭代段树的代码片段:

class Node:
    def __init__(self, l, r):
        self.l = l
        self.r = r
        self.mi = INF # INF 表示无穷大
        self.tag = None
        self.left = None
        self.right = None
    
def build(L, R):
    root = Node(L, R)
    if L < R:
        mid = (L + R) // 2
        root.left = build(L, mid)
        root.right = build(mid+1, R)
    return root
修改迭代段树

假设我们需要将区间 $[L, R]$ 中的所有元素加上 $k$,可按照以下步骤修改迭代段树:

  1. 如果当前区间 $[l, r]$ 与 $[L, R]$ 无交集,则不操作;
  2. 如果当前区间包含于 $[L, R]$,则将当前节点的值加上 $k$;
  3. 否则递归修改左右子树,并更新当前节点的值。

下面是用 Python 实现修改迭代段树的代码片段:

def modify(root, L, R, k):
    if root.l > R or root.r < L:
        return
    if root.l >= L and root.r <= R:
        root.mi += k
        root.tag = root.tag or 0
        root.tag += k
        return
    pushdown(root)
    modify(root.left, L, R, k)
    modify(root.right, L, R, k)
    root.mi = min(root.left.mi, root.right.mi)
查询迭代段树

假设我们需要查询区间 $[L, R]$ 中的最小值,可按照以下步骤查询迭代段树:

  1. 如果当前区间 $[l, r]$ 与 $[L, R]$ 无交集,则返回 $INF$;
  2. 如果当前区间包含于 $[L, R]$,则返回当前节点的值;
  3. 否则递归查询左右子树,并返回最小值。

下面是用 Python 实现查询迭代段树的代码片段:

def query(root, L, R):
    if root.l > R or root.r < L:
        return INF
    if root.l >= L and root.r <= R:
        return root.mi
    pushdown(root)
    return min(query(root.left, L, R), query(root.right, L, R))
总结

迭代段树是处理线段树问题的一种高效实现方式,实现简单,易于理解。通过构建迭代段树,我们可以快速地实现区间修改和查询操作。