HDU5266 LCA

Description

给一棵 n 个点的树,Q 个询问 [L,R] : 求点 L , 点 L+1 , 点 L+2 …… 点 R 的 LCA.

Input

多组数据.

The following line contains an integers,n(2≤n≤300000).

AT The following n−1 line, two integers are bi and ci at every line, it shows an edge connecting bi and ci.

The following line contains ans integers,Q(Q≤300000).

AT The following Q line contains two integers li and ri(1≤li≤ri≤n).

Output

For each case,output Q integers means the LCA of [li,ri].

Sample Input

5
1 2
1 3
3 4
4 5
5
1 2
2 3
3 4
3 5
1 5

Sample Output

1
1
3
3
1

solution

这题其实就是求[l,r]区间内的公共lca。

既,
\[ans(l,r)=LCA(a_l,a_{l+1},a_{l+2}\cdots a_r)\]
这里有一个显而易见的结论
\[LCA(x,y,z)=LCA\bigl(LCA(x,y),z\bigr)=LCA\bigl(LCA(z,y),x\bigr)=LCA\bigl(LCA(z,x),y\bigr)\]

所以我们在这里考虑建一棵线段树,每次pushup向上更新lca,我们可以用树剖来求lca,这样我们就可以求出区间lca了

这是代码

#include<iostream>
#include<cstdio>
#include<cstring>using namespace std;
const int maxn=300001,inf=0x7fffffff;
int n,m,tot,root,nxt[maxn<<1],to[maxn<<1],head[maxn],lca[maxn<<2],dep[maxn],siz[maxn],top[maxn],fa[maxn],son[maxn];
bool check[maxn];void addedge(int x,int y){nxt[++tot]=head[x];head[x]=tot;to[tot]=y;
}void dfs1(int u,int f) {dep[u]=dep[fa[u]=f]+(siz[u]=1);for(int i=head[u];i;i=nxt[i]) {int v=to[i];if(v==f)continue;dfs1(v,u);siz[u]+=siz[v];if(siz[v]>siz[son[u]])son[u]=v;}
}void dfs2(int u,int topf){top[u]=topf;if(!son[u])return;dfs2(son[u],topf);for(int i=head[u];i;i=nxt[i]){int v=to[i];if(v==fa[u] or v==son[u])continue;dfs2(v,v);}
}int Lca(int x,int y) {register int u=x,v=y;while(top[u]!=top[v]) {if(dep[top[u]]<dep[top[v]])swap(u,v);u=fa[top[u]];}return dep[u]<=dep[v]?u:v;
}void pushup(int o){lca[o]=Lca(lca[o<<1],lca[o<<1|1]);
}void build(int o,int l,int r){if(l==r){lca[o]=l;return;}int mid=l+r>>1;build(o<<1,l,mid);build(o<<1|1,mid+1,r);pushup(o);
}int query(int o,int l,int r,int x,int y){if(x<=l and r<=y){return lca[o];}int mid=l+r>>1,ans1=-1,ans2=-1;if(x<=mid)ans1=query(o<<1,l,mid,x,y);if(mid+1<=y)ans2=query(o<<1|1,mid+1,r,x,y);if(ans1!=-1 and ans2!=-1)return Lca(ans1,ans2);if(ans1!=-1)return ans1;if(ans2!=-1)return ans2;
}int main(){while(~scanf("%d",&n)){tot=0;memset(fa,0,sizeof(fa));memset(son,0,sizeof(son));memset(head,0,sizeof(head));for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);addedge(u,v),addedge(v,u);}dfs1(1,0);dfs2(1,1);build(1,1,n);scanf("%d",&m);while(m--){int l,r;scanf("%d%d",&l,&r);printf("%d\n",query(1,1,n,l,r));}}return 0;
}

转载于:https://www.cnblogs.com/ezoihy/p/9112927.html

HDU5266 LCA 树链剖分LCA 线段树相关推荐

  1. Luogu P5556 圣剑护符(线性基,树链剖分,线段树)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Problem 小L 和 小K 面前的圣剑由 nnn 块护符组成,分别编号为 1,2,-,n1,2,\ ...

  2. 清明梦超能力者黄YY[树链剖分+扫描线,线段树合并]

    清明梦超能力者黄YY 题目连接 https://www.nowcoder.com/acm/contest/206/I 暂时有两种做法. 算法一 涉及:树链剖分,扫描线 在一个线段的情况下,我们可以把一 ...

  3. BZOJ 2157 「国家集训队」旅游(树链剖分,线段树,边权转点权)【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2157 是 hydro 的 BZOJ ...

  4. BZOJ 2402 陶陶的难题II (树链剖分、线段树、凸包、分数规划)

    毒瘤,毒瘤,毒瘤-- \(30000\)这个数据范围,看上去就是要搞事的啊... 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2402 ...

  5. [Bzoj4196] [NOI2015] 软件包管理器 [树链剖分,线段树]

    题解摘要:树链剖分后用线段树区间查询修改,对于安装软件,将改点到根的路径全部变为1,对于卸载软件,将子树清空.注意边界,编号是从0开始的,容易漏掉树根. 第一次写树剖- 1 #include < ...

  6. BZOJ 3779 重组病毒 LCT,树链剖分,线段树

    题意: 给一棵树,每个点一开始颜色互不相同,支持三个操作                 1. 将一个点到根的路径染成一种新的颜色                 2. 将一个新的点设为根,并将原来的 ...

  7. Tree HDU - 6547 (树链剖分,线段树)

    wls 有三棵树,树上每个节点都有一个值 ai,现在有 2 种操作: 将一条链上的所有节点的值开根号向下取整: 求一条链上值的和: 链的定义是两点之间的最短路. Input 第一行两个数 n, q 分 ...

  8. HDU 3966 树链剖分后线段树维护

    题意: 一棵树, 操作1.$path(a,b)$之间的点权$+k$ 操作2.单点查询 题解: 树链剖分即可,注意代码细节,双向映射 主要是记录一下板子 #include <string.h> ...

  9. BZOJ 4732 UOJ #268 [清华集训2016]数据交互 (树链剖分、线段树)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4732 (UOJ) http://uoj.ac/problem/268 题解 ...

  10. UOJ #268 BZOJ 4732 [清华集训2016]数据交互 (树链剖分、线段树)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4732 (UOJ) http://uoj.ac/problem/268 题解 ...

最新文章

  1. 这个图片转文字功能搞一下?还好这个开源项目救了我!
  2. 【C 语言】文件操作 ( 文件结尾判定 )
  3. 《Windows Forms编程》,真正的好书!
  4. tensorflow tf.data.Dataset.from_tensor_slices() (创建一个“数据集”,其元素是给定张量的切片)
  5. 变压器耦合和电容耦合_超越变压器和抱抱面的分类
  6. P1855 榨取kkksc03
  7. python第三方库引用_Python入门:如何使用第三方库
  8. 极限编程 Extreme Programming (中英文对照)图形解释
  9. 快播案:程序正义、盗版和色情
  10. Android APK(加壳+脱壳+加固演练)浅析
  11. Excel自动填充功能
  12. Spring Boot学习笔记(二十一)Spring boot 数据校验 @Validated、@Valid用法详解
  13. 软件版本中的Alpha,Beta,RC,Trial是什么意思?
  14. snakemake--我最喜欢的流程管理工具
  15. scanf与空白字符
  16. SkeyeRTSPLive传统视频监控互联网实现利器解决方案
  17. 【蓝桥杯选拔赛真题27】Scratch报数 少儿编程scratch蓝桥杯选拔赛真题讲解
  18. 科大讯飞语音听写app闪退
  19. 互联网之父:语义Web技术已具备成功标准
  20. 看雪学院-Android安全

热门文章

  1. LTE:3GPP向4G发展的核心技术
  2. 用户态的陷入指令(trap指令,访管指令)
  3. Android Studio从入门到精通的免费视频教程
  4. 耦合性(或称“耦合度”)
  5. 工具类:自动生成名字工具类
  6. 浅谈UML---类图
  7. ROS-3DSLAM(十六)lvi-sam项目总结
  8. RK 100 上手体验 — 机械键盘客制化入门之选?
  9. Kubernetes(k8s)集群安装(需要3台centos7)
  10. Visium_Brain_deconvolution giotto解卷积