可持久化数组是由可持久化线段树或可持久化平衡树实现的。这里先给出可持久化线段树的实现方法。
为了方便起见,处理的数组长度为5, 起始的数组元素为1~5,修改是将第一个位置的数组元素改为2。
建树规则很简单,只要在叶子节点上写上该点的值就可以了。
先根据原数组建一棵线段树
第一次修改之后的线段树
我们发现,这两棵线段树中只有一个叶子节点的值发生了改变,而操作数非常多,假如每次都memset一下,然后修改一个值,空间上的巨大开销几乎无法想象,那我们可以设想一下,把两个线段树“合并一下”……
把两次线段树合并的结果
这下我们的思路就很清楚了。每次对某个历史版本进行修改时,对于所有包含该位置的区间结点全部新开一个,并与其父节点连边,对于其他结点,由于不需要发生改动,所以直接连接即可。
$Code$
1 |
|
最后,就不带模板的粘一下可持久化数组的模板
由于struct内部有函数重载,有两个版本。
struct版本
1 | struct Rope { |
class版本
1 | class Rope { |