1 介绍
本专题用来记录可持久化数据结构相关的题目。
本专题主要讲如下两类数据结构的可持久化:
- trie的可持久化
- 线段树的可持久化,即主席树
可持久化的前提:本身的拓扑的结构不变。
解决什么类型的问题:可以保存下来数据结构的所有历史版本。
核心思想:只记录每一个版本与前一个版本不同的结点。
2 训练
题目1:256最大异或和
C++代码如下,
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 600010, M = N * 25;
int n, m;
int s[N];
int tr[M][2], max_id[M];
int root[N], idx;
void insert(int i, int k, int p, int q) {
if (k < 0) {
max_id[q] = i;
return;
}
int v = s[i] >> k & 1;
if (p) tr[q][v^1] = tr[p][v^1];
tr[q][v] = ++idx;
insert(i, k-1, tr[p][v], tr[q][v]);
max_id[q] = max(max_id[tr[q][0]], max_id[tr[q][1]]);
}
int query(int root, int C, int L) {
int p = root;
for (int i = 23; i >= 0; --i) {
int v