跳至内容
CVBB ACM Team
用户工具
注册
登录
站点工具
搜索
工具
显示页面
修订记录
Copy this page
导出 PDF
反向链接
最近更改
媒体管理器
网站地图
注册
登录
>
最近更改
媒体管理器
网站地图
您在这里:
front_page
»
2020-2021
»
teams
»
legal_string
»
lgwza
»
可持久化数组
2020-2021:teams:legal_string:lgwza:可持久化数组
本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。
====== 可持久化数组 ====== ===== 例题 ===== [[https://www.luogu.com.cn/problem/P3919|洛谷 P3919 【模板】可持久化线段树 1(可持久化数组)]] 参考代码: <code cpp> #include<bits/stdc++.h> using namespace std; const int N=1e6+5; int a[N]; int rt[N*20],ls[N*20],rs[N*20],tr[N*20],cnt; void build(int& o,int l,int r){ o=++cnt; if(l==r){ tr[o]=a[l]; return; } int mid=l+r>>1; build(ls[o],l,mid); build(rs[o],mid+1,r); } void xg(int& o,int l,int r,int pre,int pos,int v){ o=++cnt; ls[o]=ls[pre]; rs[o]=rs[pre]; tr[o]=tr[pre]; if(l==r){ tr[o]=v; return; } int mid=l+r>>1; if(pos<=mid) xg(ls[o],l,mid,ls[pre],pos,v); if(pos>mid) xg(rs[o],mid+1,r,rs[pre],pos,v); } int cx(int o,int l,int r,int pos){ if(l==r) return tr[o]; int mid=l+r>>1; if(pos<=mid) return cx(ls[o],l,mid,pos); if(pos>mid) return cx(rs[o],mid+1,r,pos); } int main(){ int n,m; scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); build(rt[0],1,n); for(int i=1;i<=m;i++){ int pre,op,pos; scanf("%d %d %d",&pre,&op,&pos); if(op==1){ int v; scanf("%d",&v); xg(rt[i],1,n,rt[pre],pos,v); } else{ printf("%d\n",cx(rt[pre],1,n,pos)); rt[i]=rt[pre]; } } } </code>
2020-2021/teams/legal_string/lgwza/可持久化数组.txt
· 最后更改: 2020/08/29 01:50 由
lgwza
页面工具
显示页面
修订记录
反向链接
Copy this page
导出 PDF
回到顶部