需要用到可持久化数据结构的题目大多数都是单点修改,因此这里我们先只讨论单点修改. 我们先考察普通的线段树是怎么对某一段序列建线段树的(下图的白色节点)。 现在假设我们想修改 888 号节点,在普通线段树里,我们一路递归到 888 号节点,在 888 号节点上作出修改,再一路返回 4,2,14,2,14,2,1 更新修改. 例如如果我们的线段树维护的是区间和,那么在修改完 888 号节点后,线段树会一路返回 4,2,14,2,14,2,1 并在这些节点上维护修改过后的区间和. 我们发现,对于一次单点修改,真正发生改变的节点只有 O(logn)O(\log n)O(logn) 个. 所以,我们可以这样维护出一个新版本:假设我们有旧版本 iii,对于从根节点开始的 O(logn)O(\log n)O(logn) 个节点,先复制一份,然后根据要修改的位置选择在左儿子或者右儿子的位置创建新节点. 数据结构/可持久化