可持久化线段树,可持久化权值线段树(主席树)

匿名 (未验证) 提交于 2019-12-03 00:13:02


 1 struct node  2 {  3     int lc,rc;  4     int sum;  5     node()  6     {  7         lc=rc=sum=0;  8     }  9 }; 10 node tree[maxn*5]; 11 inline int build(int l,int r) 12 { 13     int k=++cnt; 14     if(l==r) 15     { 16         tree[k].sum=num[l]; 17         return k; 18     } 19     int mid=(l+r)>>1; 20     tree[k].lc=build(l,mid); tree[k].rc=build(mid+1,r); 21     tree[k].sum=tree[tree[k].lc].sum+tree[tree[k].rc].sum; 22     return k; 23 }

 1 inline int modify(int rt,int l,int r,int p,int v)  2 {  3     int new_rt=++cnt;  4     tree[cnt]=tree[rt];//先把原信息复制上,再修改即可实现  5     if(l==r)  6     {  7         tree[new_rt].sum+=v;  8         return new_rt;  9     } 10     int mid=(l+r)>>1; 11     if(p<=mid) tree[new_rt].lc=modify(tree[rt].lc,l,mid,p,v); 12     else tree[new_rt].rc=modify(tree[st].rc,mid+1,r,p,v);  13     tree[new_rt].sum=tree[tree[new_rt].lc].sum+tree[tree[new_rt].rc].sum; 14     return new_rt; 15 }


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!