码迷,mamicode.com
首页 > 其他好文 > 详细

可持久化线段树

时间:2020-01-22 22:17:53      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:http   版本   复杂   空间复杂度   ret   math   img   build   span   

每次进行单点修改后,会新增\(log\ n\)个新节点,即每次更改的结点数为树的高度

增加的非叶子结点一个儿子是其他版本的节点,另一个儿子是连向新节点

空间复杂度为\(O(n+m\ log\ n)\)

技术图片

\(code\)

void build(int L,int R,int &cur)
{
    cur=++tree_cnt;
    if(L==R)
    {
        val[cur]=a[L];
        return;
    }
    int mid=(L+R)>>1;
    build(L,mid,ls[cur]);
    build(mid+1,R,rs[cur]);
}
void modify(int L,int R,int pos,int v,int pre,int &cur)
{
    cur=++tree_cnt;
    ls[cur]=ls[pre],rs[cur]=rs[pre];
    val[cur]=val[pre];
    if(L==R)
    {
        val[cur]=v;
        return;
    }
    int mid=(L+R)>>1;
    if(pos<=mid) modify(L,mid,pos,v,ls[pre],ls[cur]);
    if(pos>mid) modify(mid+1,R,pos,v,rs[pre],rs[cur]);
}
int query(int L,int R,int pos,int cur)
{
    if(L==R) return val[cur];
    int mid=(L+R)>>1;
    if(pos<=mid) return query(L,mid,pos,ls[cur]);
    if(pos>mid) return query(mid+1,R,pos,rs[cur]);
}

可持久化线段树

标签:http   版本   复杂   空间复杂度   ret   math   img   build   span   

原文地址:https://www.cnblogs.com/lhm-/p/12229512.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!