可持久化数据结构入门(数组篇)

题目描述

如题,你需要维护这样的一个长度为 N 的数组,支持如下几种操作

1.在某个历史版本上修改某一个位置上的值

2.访问某个历史版本上的某一位置的值

此外,每进行一次操作(对于操作2,即为生成一个完全一样的版本,不作任何改动),就会生成一个新的版本。版本编号即为当前操作的编号(从1开始编号,版本0表示初始状态数组)

输入输出样例

输入样例#1
5 10
59 46 14 87 41
0 2 1
0 1 1 14
0 1 1 57
0 1 1 88
4 2 4
0 2 5
0 2 4
4 2 1
2 2 2
1 1 5 91

输出样例#1:
59
87
41
87
88
46

维护序列操作,我们很容易就想到了用线段树来存储,但是必须要把之前所有版本都存下来吗?

我们会发现,修改一个节点,只会对它的祖先产生影响,也就是最多log2n个节点被修改,所以每次只需要单独新开一条链出来,维护一下节点信息就行了。

猜你喜欢

转载自www.cnblogs.com/wwlwQWQ/p/10516110.html