320 字
2 分钟
4-2数据结构2
数据结构(三)
~目录
Part 7.13 树链剖分
Part 7.14 树套树
Part 7.15 动态树
Part 7.16 可持久化数据结构
Part 7.17 K-D Tree
Part 7.18 珂朵莉树
Part 7.13 树链剖分
Part 7.14 树套树
Part 7.15 动态树
Part 7.16 可持久化数据结构
可持久化线段树(普通版本)
此版本,二分主席树,O(log^(2)n) 时间二分区间第一个大于等于x的位置
struct TRE{ int ls, rs, sum;} tre[N*40];int root[N*40], cnt;
int build(int l, int r){ int k = ++cnt; tre[k] = {0}; if (l < r) { int mid = (l + r) >> 1; tre[k].l = build(l, mid); tre[k].r = build(mid + 1, r); } return k;}
int change(int lst, int l, int r, int op){ int k = ++cnt; tre[k] = tre[lst]; tre[k].sum++; if (l < r) { int mid = (l + r) >> 1; if (mid >= op) tre[k].ls = change(tre[lst].ls, l, mid, op); else tre[k].rs = change(tre[lst].rs, mid + 1, r, op); } return k;}
int query(int a1, int a2, int l, int r, int k){ if (l == r) return l; int xx = tre[tre[a2].ls].sum - tre[tre[a1].ls].sum;
int mid = (l + r) >> 1; if (xx >= k) return query(tre[a1].ls, tre[a2].ls, l, mid, k); else return query(tre[a1].rs, tre[a2].rs, mid + 1, r, k - xx);}
//打印 版本 范围void nszka(int k,int l,int r){ auto []=tre[k];//输出 if(l==r) { //操作 return ; } int mid=(l+r)>>1; nszka(tre[k].ls,l,mid); nszka(tre[k].rs,mid+1,r);}