洛谷 2633 BZOJ 2588 Spoj 10628. Count on a tree
【题解】
蜜汁强制在线。。。
每个点开一个从它到根的可持久化权值线段树。查询的时候利用差分的思想在树上左右横跳就好了。
1 #include<cstdio> 2 #include<algorithm> 3 #define N 100010 4 #define rg register 5 #define ls (a[u].l) 6 #define rs (a[u].r) 7 using namespace std; 8 int n,n2,m,tot,root[N],last[N],dep[N],top[N],hvy[N],fa[N],size[N],val[N],b[N]; 9 struct tree{ 10 int sum,l,r; 11 }a[N*80]; 12 struct edge{ 13 int to,pre; 14 }e[N<<1]; 15 inline int read(){ 16 int k=0,f=1; char c=getchar(); 17 while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); 18 while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar(); 19 return k*f; 20 } 21 inline int qlca(int x,int y){ 22 int f1=top[x],f2=top[y]; 23 while(f1!=f2){ 24 if(dep[f1]<dep[f2]) swap(x,y),swap(f1,f2); 25 x=fa[f1]; f1=top[x]; 26 } 27 return dep[x]<dep[y]?x:y; 28 } 29 void update(int &u,int l,int r,int pos){ 30 a[++tot]=a[u]; a[u=tot].sum++; 31 if(l==r) return; 32 int mid=(l+r)>>1; 33 if(pos<=mid) update(ls,l,mid,pos); 34 else update(rs,mid+1,r,pos); 35 } 36 int query(int u,int v,int lca,int f,int l,int r,int k){ 37 if(l==r) return l; 38 int tmp=a[ls].sum+a[a[v].l].sum-a[a[lca].l].sum-a[a[f].l].sum,mid=(l+r)>>1; 39 return k<=tmp?query(ls,a[v].l,a[lca].l,a[f].l,l,mid,k):query(rs,a[v].r,a[lca].r,a[f].r,mid+1,r,k-tmp); 40 } 41 void dfs1(int x){ 42 size[x]=1; dep[x]=dep[fa[x]]+1; 43 root[x]=root[fa[x]]; update(root[x],1,n2,val[x]); 44 for(rg int i=last[x],to;i;i=e[i].pre)if((to=e[i].to)!=fa[x]){ 45 fa[to]=x; dfs1(to); 46 size[x]+=size[to]; 47 if(size[to]>size[hvy[x]]) hvy[x]=to; 48 } 49 } 50 void dfs2(int x,int tp){ 51 top[x]=tp; 52 if(hvy[x]) dfs2(hvy[x],tp); 53 for(rg int i=last[x],to;i;i=e[i].pre) 54 if((to=e[i].to)!=fa[x]&&to!=hvy[x]) dfs2(to,to); 55 } 56 int main(){ 57 n=read(); m=read(); 58 for(rg int i=1;i<=n;i++) val[i]=b[i]=read(); 59 sort(b+1,b+1+n); n2=unique(b+1,b+1+n)-b-1; 60 for(rg int i=1;i<=n;i++) val[i]=lower_bound(b+1,b+1+n2,val[i])-b; 61 for(rg int i=1;i<n;i++){ 62 int u=read(),v=read(); 63 e[++tot]=(edge){v,last[u]}; last[u]=tot; 64 e[++tot]=(edge){u,last[v]}; last[v]=tot; 65 } 66 tot=0; dfs1(1); dfs2(1,1); 67 int last=0; 68 while(m--){ 69 int u=read()^last,v=read(),k=read(),l=qlca(u,v),f=fa[l]; 70 printf("%d\n",last=b[query(root[u],root[v],root[l],root[f],1,n2,k)]); 71 } 72 return 0; 73 }
View Code
转载于:https://www.cnblogs.com/DriverLao/p/8796247.html
洛谷 2633 BZOJ 2588 Spoj 10628. Count on a tree相关推荐
- BZOJ 2588: Spoj 10628. Count on a tree 树上跑主席树
2588: Spoj 10628. Count on a tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/J ...
- BZOJ 2588: Spoj 10628. Count on a tree( LCA + 主席树 )
Orz..跑得还挺快的#10 自从会树链剖分后LCA就没写过倍增了... 这道题用可持久化线段树..点x的线段树表示ROOT到x的这条路径上的权值线段树 ----------------------- ...
- bzoj 2588 Spoj 10628. Count on a tree (可持久化线段树)
Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MB Submit: 7669 Solved: 1894 [Sub ...
- BZOJ 2588 Spoj 10628 Count on a tree | 树上主席树
BZOJ 2588 Count on a tree 题面 求树上两点之间路径上第k大的点权. 题解 一开始看到这道题觉得是树剖,然后又听说是主席树,然后以为是主席树+树剖,差点没吓死-- 然后发现,如 ...
- 主席树 || 可持久化线段树 || LCA || BZOJ 2588: Spoj 10628. Count on a tree || Luogu P2633 Count on a tree...
题面: Count on a tree 题解: 主席树维护每个节点到根节点的权值出现次数,大体和主席树典型做法差不多,对于询问(X,Y),答案要计算ans(X)+ans(Y)-ans(LCA(X,Y) ...
- bzoj2588: Spoj 10628. Count on a tree(树上第k大)(主席树)
每个节点继承父节点的树,则答案为query(root[x]+root[y]-root[lca(x,y)]-root[fa[lca(x,y)]]) #include<iostream> #i ...
- bzoj2588: Spoj 10628. Count on a tree 主席树
在每一个点的父亲做主席树,每次访问时用两个点的和减去其LCA和LCA父亲的和即可. #include<bits/stdc++.h> using namespace std; inline ...
- SPOJ 10628 Count on a tree 主席树 附数据生成器
很奇怪的题啊,感觉思路和别人一样,但是我得用快速IO才能AC--不然就T 没用快速output,只用了快速input 而且居然限制代码长度...代码要短于6000B,我改了好久啊 题目大意:给一棵树, ...
- 【SPOJ】Count On A Tree II(树上莫队)
[SPOJ]Count On A Tree II(树上莫队) 题面 洛谷 Vjudge 洛谷上有翻译啦 题解 如果不在树上就是一个很裸很裸的莫队 现在在树上,就是一个很裸很裸的树上莫队啦. #incl ...
最新文章
- matlab画图(复数的直角坐标和极坐标)(-)
- python编写直角三角形边长公式_304不锈钢的重量计算公式,留着总有用处
- 服务器的安装文件,服务器存储安装文件
- 20 分钟教你搞懂 Git!
- 【并行计算-CUDA开发】CUDA shared memory bank 冲突
- 把wasm反编译出来
- 企业GDPR安全隐私合规性指南
- 电子设计大赛-AD与DA电路设计
- 安卓开发调用python脚本_android开发调用python脚本
- 项目管理(一) - RFP、合同与SOW的内容与区别
- 【虚拟仿真】Unity3D中实现UI跟随3D模型旋转移动、UI一直面朝屏幕
- iOS和安卓的base64
- 求极值函数-MATLAB
- html铺满整个页面_html 怎么让背景图铺满整个页面?
- 戴尔d系列服务器,戴尔科技集团推出两款全新VxRail产品
- uniapp添加阿里字体图标库图标
- vue下载大文件时浏览器不显示下载进度
- ADD_MONTHS函数的使用
- input之怎么清除默认值
- java的memset怎么写_memset函数使用详解
热门文章
- 语音包mp3_目标明确,为运动而造 ,自带MP3功能的南卡RUNNER PRO骨传导耳机
- 时针与分针的夹角的易错点
- lua游戏脚本实例源码_Redis Lua脚本中学教程(上)
- 路由算法之距离矢量算法和链路状态算法
- 试题11 蒜头君的随机数(排序和去重)
- OpenGL基础26:Assimp库
- bzoj 1191: [HNOI2006]超级英雄Hero
- 知名互联网公司系统架构图[第1期]
- jQuery Mobile事件,开发全解+完美注释
- 论计算机网络的发展及运用,试论计算机网络发展及其应用研究