博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Luogu P3919【模板】可持久化数组(可持久化线段树/平衡树)
阅读量:4951 次
发布时间:2019-06-11

本文共 2255 字,大约阅读时间需要 7 分钟。

题面:

不知道说啥,总之我挺喜欢自己打的板子的!

1 #include
2 #include
3 #include
4 using namespace std; 5 inline int rd(){ 6 int x=0,f=1;char c=getchar(); 7 while(c<'0'||c>'9'){
if(c=='-')f=-1; c=getchar();} 8 while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();} 9 return f*x;10 }11 const int maxn=(1e6)+50,maxm=maxn;12 int N,M,num_treenode=0,root[maxm],belong_root[maxm],num_root=0,u,num_version=0,A[maxn],V,loc,o,val;13 struct Tree{14 int ls,rs,l,r,data;15 }t[(maxn<<2)+22*maxm];16 inline void Build(int x,int l,int r){17 t[x].l=l;t[x].r=r;18 if(l==r){19 t[x].data=A[l];20 return;21 }22 int mid=(l+r)>>1;23 t[x].ls=++num_treenode;Build(num_treenode,l,mid);24 t[x].rs=++num_treenode;Build(num_treenode,mid+1,r);25 return;26 }27 inline void Update(int x,int u,int loc,int v){28 int l=t[u].l,r=t[u].r,mid=(l+r)>>1;29 t[x].l=l;t[x].r=r;30 if(l==r&&l==loc){31 t[x].data=v;32 return;33 }34 if(loc<=mid){35 t[x].rs=t[u].rs;36 t[x].ls=++num_treenode;37 Update(num_treenode,t[u].ls,loc,v);38 }39 else{40 t[x].ls=t[u].ls;41 t[x].rs=++num_treenode;42 Update(num_treenode,t[u].rs,loc,v);43 }44 return;45 }46 inline int Query(int x,int loc){47 int l=t[x].l,r=t[x].r,mid=(l+r)>>1;48 if(l==r&&l==loc) return t[x].data;49 if(loc<=mid)return Query(t[x].ls,loc);50 else return Query(t[x].rs,loc);51 }52 int main(){53 N=rd();M=rd();54 for(int i=1;i<=N;i++)A[i]=rd();55 root[++num_root]=++num_treenode;//root[i]数组记录树i的根节点是哪个 56 belong_root[0]=num_root;//belong_root[i]记录版本i的树根是哪个 57 Build(num_treenode,1,N);58 while(M--){59 V=rd();o=rd();loc=rd();60 u=belong_root[V];//u记录第V个版本到底属于哪颗树 61 if(o==1){62 val=rd();63 root[++num_root]=++num_treenode;//多了一颗树 64 Update(num_treenode,root[u],loc,val);65 belong_root[++num_version]=num_root;66 }67 else{68 printf("%d\n",Query(root[u],loc));69 belong_root[++num_version]=u;70 } 71 }72 return 0;73 }

By:AlenaNuna

转载于:https://www.cnblogs.com/AlenaNuna/p/10386616.html

你可能感兴趣的文章
拓扑学中凝聚点的几个等价定义
查看>>
DOM node类型 document类型 element类型 text类型 DocumentFragment类型
查看>>
chrome设置捕获异常时自动暂停js
查看>>
【JBPM4】State 节点
查看>>
JavaScript利用闭包实现模块化(*****************************************)
查看>>
View(视图)——AutoCompleteTextView 、Spinner和消息提示
查看>>
Ubuntu16.04 + OpenCV源码 + Qt5.10 安装、配置
查看>>
php中mysqli_fetch_assoc()和mysqli_fetch_row()的区别
查看>>
线性基
查看>>
django 多对多 增 删 改 查
查看>>
Zynq7000开发系列-7(在Zybo上运行Linaro桌面系统)
查看>>
NSSetUncaughtExceptionHandler
查看>>
bc#34-2 Building Blocks
查看>>
struts2自定义结果类型demo
查看>>
30个高质量的Psd设计文件分享
查看>>
生成器
查看>>
go 格式化时间戳
查看>>
Spring 2017 Assignments2
查看>>
查找进程并杀掉
查看>>
BZOJ 3943 [Usaco2015 Feb]SuperBull:最大生成树
查看>>