可持久化数组是由可持久化线段树或可持久化平衡树实现的。这里先给出可持久化线段树的实现方法。
为了方便起见,处理的数组长度为5, 起始的数组元素为1~5,修改是将第一个位置的数组元素改为2。
建树规则很简单,只要在叶子节点上写上该点的值就可以了。
先根据原数组建一棵线段树
第一次修改之后的线段树
我们发现,这两棵线段树中只有一个叶子节点的值发生了改变,而操作数非常多,假如每次都memset一下,然后修改一个值,空间上的巨大开销几乎无法想象,那我们可以设想一下,把两个线段树“合并一下”……
把两次线段树合并的结果
这下我们的思路就很清楚了。每次对某个历史版本进行修改时,对于所有包含该位置的区间结点全部新开一个,并与其父节点连边,对于其他结点,由于不需要发生改动,所以直接连接即可。
Code C o d e
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#define maxn 2000005
int n, m, p, x, y, lastans;
int a[maxn];
inline int getint() {
int num = 0, sign = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
ch == '-' ? sign = -1 : 1;
ch = getchar();
}
while (ch >= '0