可持久化线段树(主席树)
可持久化线段树是一类线段树的实现方式,用于保存线段树的历史版本。从而方便查询区间第k大值。 可持久化线段树可以看作一系列线段树的集合,这样的话就需要n^2的空间,显然无法接受。但是我们发现每次修改都只是改一条链,因此可以用动态开点的方式每次只新建一条链的节点,空间就是nlogn。
//修改
void insert(int &o, int l, int r, int x) { tree[++tot] = tree[o]; o = tot; tree[o].val++; if(l == r) return; int mid = (l + r) >> 1; if(x <= mid) insert(tree[o].lch, l, mid, x); else insert(tree[o].rch, mid + 1, r, x); }
//查询
int query(int o1, int o2, int l, int r, int k) { if(l == r) return l; int mid = (l + r) >> 1; int num = tree[tree[o2].lch].val - tree[tree[o1].lch].val; if(k <= num) return query(tree[o1].lch, tree[o2].lch, l, mid, k); else return query(tree[o1].rch, tree[o2].rch, mid + 1, r, k - num); }

浙公网安备 33010602011771号