可持久化线段树总结_第1页
可持久化线段树总结_第2页
可持久化线段树总结_第3页
可持久化线段树总结_第4页
可持久化线段树总结_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、可持久化线段树的总结 by石门中学柯新宇 可持久化线段树,说白了,就是具有一个个时间的树链。因为修 改单点,只会对树上的一条链发生改变,我们只需记录更改过的树链 即可。 我们可以发现,每次修改单点时,只会影响到一条链,只需把链 存起来就行了。 我才用的方法是:对于每一次修改,开一个root,记录树根。(用 指针类型,写起来比较方便) struct nodelong long s,d; node *left,*right; tree(max n 5)+(max n 3),*rootmax n; node *newno de() t0+; treetO.s二treetO.d=O; treetO.l

2、eft二treetO.right二tree; return tree+tO; root0=newnode(); for(int i=1;i=ti;i+) rooti=newnode(); for(int i=1;id+;ro-s+=v;return; int mid=(L+R)1; node *yy=newnode(); / 新开节点 if(xleft; / 拷贝原来的信息 ro-left=yy; / 将新的节点连给父亲结点 updata(ro-left,L,mid,x,v); else *yy=*ro-right; ro-right=yy; updata(ro-right,mid+1,R,x

3、,v); ro-s=ro-left-s+ro-right-s; /up 操作 ro-d=ro-left-d+ro-right-d; 至于,区间修改,开个懒惰标记记一记就好了,不用每次更新都 下发标记(这样会爆空间的) ,查询的时候加上祖先的标记就好了。 有几道比较经典的题,可以用来练练手: 先把可持久化线段树模板练熟了,做题会事半功倍。 因为这都是“套路” Bzoj2588-比较麻烦,离散化加 lea 加 query(r1,r2,r3,r4,1,n,) Bzoj2809离散化 Hdu5919 Hdu4348 Bzoj2809代码: #include #include #define imin(

4、a,b) (ab)?a:b) #define maxn 100050 using namespace std; int n,m,t0,ti; long long ans; int famaxn,llmaxn; long long cctmaxn; struct aaaaint l,r,d; tmmaxn; struct nodelong long s,d; node *left,*right; tree(maxn5)+(maxn3),*rootmaxn; struct eeeeint fa,pi; long long ci,li; masmaxn; int hmaxn,d0; struct d

5、ataint to,next; dmaxn; node *newnode() t0+; treet0.s=treet0.d=0; treet0.left=treet0.right=tree; return tree+t0; bool cmp(int A,int B) return (masA.ci0;p=dp.next) dfs(dp.to); tmyu.r=ti; void updata(node *ro,int L,int R,int x,long long v) if(L=R)ro-d+;ro-s+=v;return; int mid=(L+R)1; node *yy=newnode()

6、; if(xleft; ro-left=yy; updata(ro-left,L,mid,x,v); else *yy=*ro-right; ro-right=yy; updata(ro-right,mid+1,R,x,v); ro-s=ro-left-s+ro-right-s; ro-d=ro-left-d+ro-right-d; long long query(node *r1,node *r2,int L,int R,long long M) if(L=R) return imin(r2-d-r1-d),M/cctL); if(r2-s-r1-sd-r1-d; long long xx=

7、r2-left-s-r1-left-s; int mid=(L+R)1; if(xx=M) return query(r1-left,r2-left,L,mid,M); else return (r2-left-d-r1-left-d+query(r1-right,r2-right,mid+1,R,M-xx); int main() scanf(%d%d, mas0.li=0; ti=0; tree0.left=tree0.right=tree; for(int i=1;i=n;i+) scanf(%d%lld%lld, lli=i; addedge(masi.fa,i); sort(ll+1

8、,ll+1+n,cmp); int last=-1,y0=0; for(int i=1;i=n;i+) if(last!=maslli.ci) y0+; last=maslli.ci; ccty0=maslli.ci; maslli.pi=y0; ti=-1; dfs(0); root0=newnode(); for(int i=1;i=ti;i+) rooti=newnode(); for(int i=1;i=ti;i+) *rooti=*rooti-1; updata(rooti,1,y0,mastmi.d.pi,mastmi.d.ci); ans=0; for(int i=1;ians)

9、?num*mastmi.d.li:ans; printf(%lldn,ans); 4408: Fjoi 2016神秘数 Time Limit: 10 Sec Memory Limit: 128 MB 一个可重复数字集合S的神秘数定义为最小的不能被 S的子集的 和表示的正整数。例如 S=1,1,1,4,13, 1 = 1 2 = 1+1 3 = 1+1+1 4 = 4 5 = 4+1 6 = 4+1+1 7 = 4+1+1+1 8无法表示为集合S的子集的和,故集合S的神秘数为a=c;a+) using namespace std; int n,m0,m,t0; int dmaxn,mpmaxn;

10、 struct data data *left,*right; int sum; tree80*maxn,*rootmaxn; bool cmp(int a,int b) return (dax | Rsum+=vv; return; int mid=(L+R)1; data *yy=newnode(); if(xleft; ro-left=yy; updata(ro-left,L,mid,x,vv); else *yy=*ro-right; ro-right=yy; updata(ro-right,mid+1,R,x,vv); ro-sum=ro-left-sum+ro-right-sum;

11、 int query(data *r1,data *r2,int L,int R,int li,int ri) if(liR | riL) return 0; if(li=L int mid=(L+R)1; int x1=query(r1-left,r2-left,L,mid,li,ri); int x2=query(r1-right,r2-right,mid+1,R,li,ri); return (x1+x2); int main() scanf(%d, For(i,1,n) scanf(%d, dn+1=1e9; sort(mp+1,mp+1+n,cmp); int oi=0,p=0; F

12、or(i,1,n) oi=(pdmpi)?oi+1:oi; p=dmpi; mpi=oi; m0=oi; scanf(%d, tree0.left=tree0.right=tree; for(int i=1;i=n;i+) rooti=newnode(); root0= For(ti,1,n) *rootti=*rootti-1; updata(rootti,1,m0,mpti,dti); For(i,1,m) int ll,rr; scanf(%d%d, int lose=1,he=0; for(;) int l=0,r=n+1; while(l+11; if(dmm=lose) l=mm; else r=mm; he=qu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论