可持久化数据结构 就是使数据结构可以返回历史版本
一般的实现方法是新建有修改的点 其他点与上一版本共用 这样做到空间复杂度带上一个或两个log
主席树(可持久化线段树、函数式线段树)
学习参考资料:
Seter:1901: Zju2112 Dynamic Rankings
徐亦轲:主席树
题目练习:
[主席树套堆 区间修改 标记永久化] BZOJ 3489 A simple rmq problem
[树状数组套权值线段树] BZOJ 1901 Zju2112 Dynamic Rankings
[主席树 启发式合并] BZOJ 3123 [Sdoi2013]森林
[主席树] BZOJ 3673 可持久化并查集 by zky BZOJ 3674 可持久化并查集加强版
[主席树 树状数组套权值线段树] BZOJ 1146 [CTSC2008]网络管理Network
可持久化字典树
类似主席树 每次新增一条从叶子到根的链 实际上字典树就是线段树
题目练习:
[可持久化字典树 分块] BZOJ 2741 【FOTILE模拟赛】L
[可持久化字典树] BZOJ 4546 codechef XRQRS
可持久化平衡树
SBT、Splay以及旋转版Treap等BST都不可以比较方便地实现‘可持久化操作’
选择用非旋转版本的treap
奉上 memphis blog一篇:
题目练习:
UVA 12538 Version Controlled IDE 可持久化treap
可持久化块状链表
有的时候复杂度较其他会更优 参考丽洁姐的pdf
可持久化并查集
实际上就是维护一个可持久化的数组
用可持久化线段树 或 可持久化平衡树做
详见bz上zky的题
参考资料
Persistent Data Structures(可持久化的数据结构)