跳至内容
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/P3834|洛谷 P3834 【模板】可持久化线段树 2(主席树)]] 参考代码: <code cpp> #include<bits/stdc++.h> using namespace std; const int N=2e5+5; int cnt; int a[N],b[N],rt[N]; int tr[N<<5],ls[N<<5],rs[N<<5]; void build(int& o,int l,int r){ o=++cnt; tr[o]=0; int mid=l+r>>1; if(l==r){ return; } build(ls[o],l,mid); build(rs[o],mid+1,r); } void xg(int& o,int l,int r,int pre,int x){ o=++cnt; ls[o]=ls[pre]; rs[o]=rs[pre]; tr[o]=tr[pre]+1; int mid=l+r>>1; if(l==r) return; if(x<=mid) xg(ls[o],l,mid,ls[pre],x); if(x>mid) xg(rs[o],mid+1,r,rs[pre],x); } int cx(int u,int v,int l,int r,int k){ if(l>=r) return l; int x=tr[ls[v]]-tr[ls[u]]; int mid=l+r>>1; if(x>=k) return cx(ls[u],ls[v],l,mid,k); else return cx(rs[u],rs[v],mid+1,r,k-x); } int main(){ int n,q,m; scanf("%d %d",&n,&q); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); b[i]=a[i]; } sort(b+1,b+n+1); m=unique(b+1,b+n+1)-b-1; build(rt[0],1,m); for(int i=1;i<=n;i++){ int t=lower_bound(b+1,b+m+1,a[i])-b; xg(rt[i],1,m,rt[i-1],t); } while(q--){ int x,y,z; scanf("%d %d %d",&x,&y,&z); int t=cx(rt[x-1],rt[y],1,m,z); printf("%d\n",b[t]); } return 0; } </code>
2020-2021/teams/legal_string/lgwza/主席树.txt
· 最后更改: 2020/08/29 14:30 由
lgwza
页面工具
显示页面
修订记录
反向链接
Copy this page
导出 PDF
回到顶部