bzoj 2588 树上主席树
来源:互联网 发布:童年动画 知乎 编辑:程序博客网 时间:2024/05/16 15:04
主席树上树,对于每个节点,继承其父亲的,最后跑f[x]+f[y]-f[lca]-f[fa[lca]]
去重竟然要减一,我竟然不知道??
#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#define N 100005using namespace std;int e=1,head[N];struct edge{ int u,v,next;}ed[2*N];void add(int u,int v){ ed[e].u=u;ed[e].v=v; ed[e].next=head[u]; head[u]=e++;} int root[2*N],sum[80*N],lon[80*N],ron[80*N],sz;int dep[2*N],fa[2*N][18],n,m,v[2*N],num[2*N],num_cnt; void print(int rt,int l,int r){ if(!rt) return; printf("%d %d %d %d %d %d\n",rt,l,r,lon[rt],ron[rt],sum[rt]); int mid=(l+r)>>1; print(lon[rt],l,mid); print(ron[rt],mid+1,r);}void update(int p,int &rt,int l,int r,int x){ rt=++sz; sum[rt]=sum[p]+1; if(l==r) return; lon[rt]=lon[p]; ron[rt]=ron[p]; int mid=(l+r)>>1; if(x<=mid) update(lon[p],lon[rt],l,mid,x); else update(ron[p],ron[rt],mid+1,r,x);} void dfs(int x){ for(int i=1;i<=17;i++) if((1<<i)<=dep[x]) fa[x][i]=fa[fa[x][i-1]][i-1]; else break; update(root[fa[x][0]],root[x],1,num_cnt,v[x]); for(int i=head[x];i;i=ed[i].next){ int v=ed[i].v; if(v==fa[x][0]) continue; dep[v]=dep[x]+1; fa[v][0]=x; dfs(v); }}int lca(int x,int y){ if(dep[x]<dep[y])swap(x,y); int t=dep[x]-dep[y]; for(int i=17;~i;i--) if(t&(1<<i)) x=fa[x][i]; if(x==y)return x; for(int i=17;~i;i--) if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i]; return fa[x][0]; } int query(int x,int y,int k){ int ca=lca(x,y); int a=root[x],b=root[y],c=root[ca],d=root[fa[ca][0]]; int l=1,r=num_cnt; while(l<r){ int mid=(l+r)/2; int tmp=sum[lon[a]]+sum[lon[b]]-sum[lon[c]]-sum[lon[d]]; if(tmp>=k){r=mid;a=lon[a];b=lon[b];c=lon[c];d=lon[d];/*printf("666\n");*/} else{k-=tmp;l=mid+1;a=ron[a];b=ron[b];c=ron[c];d=ron[d];} } //printf("l==%d\n",l); return num[l];}int main(){ int U,V,kth; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&v[i]); num[i]=v[i]; } sort(num+1,num+n+1); num_cnt=unique(num+1,num+n+1)-num-1; for(int i=1;i<=n;i++) v[i]=lower_bound(num+1,num+num_cnt+1,v[i])-num; for(int i=1;i<n;i++){ scanf("%d%d",&U,&V); add(U,V); add(V,U); } dep[0]=-1; dfs(1); int ans=0; for(int i=1;i<=m;i++){ scanf("%d%d%d",&U,&V,&kth); U^=ans; ans=query(U,V,kth); printf("%d",ans); if(i<m) printf("\n"); } return 0;}
阅读全文
0 0
- bzoj 2588 树上主席树
- BZOJ 2588 & SPOJ 10628:树上主席树
- BZOJ BZOJ 2588: Spoj 10628. Count on a tree 树上主席树
- 【BZOJ 2588】 Spoj 10628. Count on a tree|树上K大|树链剖分|主席树
- bzoj 2588: Spoj 10628. Count on a tree(树上主席树)
- 【BZOJ 2588】Count on a tree 【树上路径第K大】【LCA+主席树】
- 【BZOJ 2588】Spoj 10628. Count on a tree 主席树+树上差分
- BZOJ 2588 Count on a tree(树上的主席树)
- bzoj 4448: [Scoi2015]情报传递 (树上主席树)
- BZOJ 3123: [Sdoi2013]森林 启发式合并 树上主席树
- BZOJ 2588 主席树
- bzoj2588树上主席树
- bzoj 2588(树链剖分+主席树)
- BZOJ 2588 LCA + 主席树
- BZOJ 3221 [Codechef FEB13] Obserbing the tree树上询问 树链剖分 主席树维护区间加等差数列
- BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问 树链剖分 主席树
- BZOJ 1146: [CTSC2008]网络管理Network 【树上带修改主席树】
- bzoj 3932(主席树)
- servlet&jsp的基本使用
- sqlserver数据库命名规范
- select标签中值的获取方法
- nvidia jetson 开发板运行 jetson-inference 出现问题的终极解决办法
- 顶部状态栏改变颜色
- bzoj 2588 树上主席树
- java动态代理机制--那些让你面试脱颖而出的技能
- 动态规划中级教程 646. Maximum Length of Pair Chain
- Android面试中值得深思的问题
- 未能加载文件或程序集“MySQLDriverCS”或它的某一个依赖项。试图加载格式不正确的程序
- 转义字符
- linux 切换Java版本不正确
- <转载>工程师们,不要想一辈子靠技术混饭吃
- CC2640R2F BLE5.0 蓝牙协议栈数据长度扩展功能(LE Data Length Extension)