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);
}

可持久化并查集#

可持久化字典树#

Part 7.17 K-D Tree#

Part 7.18 珂朵莉树#

4-2数据结构2
https://fuwari.vercel.app/posts/4-2数据结构2/
作者
nszkay
发布于
2026-01-07
许可协议
CC BY-NC-SA 4.0