题目描述

如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。

输入输出格式

输入格式:

第一行包含三个正整数N、M、S,分别表示树的结点个数、询问的个数和树根结点的序号。

接下来N-1行每行包含两个正整数x、y,表示x结点和y结点之间有一条直接连接的边(数据保证可以构成树)。

接下来M行每行包含两个正整数a、b,表示询问a结点和b结点的最近公共祖先。

输出格式:

输出包含M行,每行包含一个正整数,依次为每一个询问的结果。

输入输出样例

输入样例#1: 复制

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

输出样例#1: 复制

4
4
1
4
4

说明

时空限制:1000ms,128M

数据规模:

对于30%的数据:N<=10,M<=10

对于70%的数据:N<=10000,M<=10000

对于100%的数据:N<=500000,M<=500000

样例说明:

该树结构如下:

第一次询问:2、4的最近公共祖先,故为4。

第二次询问:3、2的最近公共祖先,故为4。

第三次询问:3、5的最近公共祖先,故为1。

第四次询问:1、2的最近公共祖先,故为4。

第五次询问:4、5的最近公共祖先,故为4。

故输出依次为4、4、1、4、4。

树链剖分求LCA

不断跳,跳到一条重链

输出在上面的

不用写线段树

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN=2*1e6+10;
#define ls k<<1
#define rs k<<1|1
inline char nc()
{static char buf[MAXN],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,MAXN,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{char c=nc();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=nc();}while(c>='0'&&c<='9'){x=x*10+c-'0',c=nc();}return x*f;
}
struct node
{int u,v,nxt;
}edge[MAXN];
int head[MAXN];
int num=1;
void AddEdge(int x,int y)
{edge[num].u=x;edge[num].v=y;edge[num].nxt=head[x];head[x]=num++;
}
int fa[MAXN],deep[MAXN],tot[MAXN],son[MAXN],top[MAXN],cnt;
int dfs1(int now,int f,int dep)
{deep[now]=dep;fa[now]=f;tot[now]=1;int maxson=-1;for(int i=head[now];i!=-1;i=edge[i].nxt){if(edge[i].v==f) continue;tot[now]+=dfs1(edge[i].v,now,dep+1);if(tot[edge[i].v]>maxson) maxson=tot[edge[i].v],son[now]=edge[i].v;}return tot[now];
}
void dfs2(int now,int topf)
{top[now]=topf;if(!son[now]) return ;dfs2(son[now],topf);for(int i=head[now];i!=-1;i=edge[i].nxt)if(edge[i].v!=son[now]&&edge[i].v!=fa[now])dfs2(edge[i].v,edge[i].v);
}
int LCA(int x,int y)
{while(top[x]!=top[y]){if(deep[top[x]]<deep[top[y]]) swap(x,y);x=fa[top[x]];}if(deep[x]>deep[y]) swap(x,y);return x;
}
int main()
{#ifdef WIN32freopen("a.in","r",stdin);#else#endifmemset(head,-1,sizeof(head));int N=read(),M=read(),root=read();for(int i=1;i<=N-1;i++) {int x=read(),y=read();AddEdge(x,y);AddEdge(y,x);}dfs1(root,0,1);dfs2(root,root);while(M--){int x=read(),y=read();printf("%d\n",LCA(x,y));}return 0;
}

转载于:https://www.cnblogs.com/zwfymqz/p/8097366.html

洛谷P3379 【模板】最近公共祖先(LCA)(树链剖分)相关推荐

  1. ⌈洛谷1505⌋⌈BZOJ2157⌋⌈国家集训队⌋旅游【树链剖分】

    题目链接 [洛谷] [BZOJ] 题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T ...

  2. BZOJ3626 LNOI2014 LCA 树链剖分

    题意:给定一棵树,每次询问给出l r z,求在[l,r]区间内的每个节点i与z的最近公共祖先的深度之和 题解: 显然,暴力求解的复杂度是无法承受的. 考虑这样的一种暴力,我们把 z 到根上的点全部打标 ...

  3. HDU - 6393 Traffic Network in Numazu(线段树+LCA+树链剖分+并查集)

    题目链接:点击查看 题目大意:给出一个由n个点和n条边组成的图,每条边都有权值,题目保证图是连通的,然后给出m个询问,每次询问分为两种形式: 0 x y:将第x条边的权值修改为y 1 x y:查询x- ...

  4. HDU5266 LCA 树链剖分LCA 线段树

    HDU5266 LCA Description 给一棵 n 个点的树,Q 个询问 [L,R] : 求点 L , 点 L+1 , 点 L+2 -- 点 R 的 LCA. Input 多组数据. The ...

  5. CF613D-Kingdom and its Cities【虚树,LCA,树链剖分,贪心】

    正题 题目链接:https://www.luogu.org/problem/CF613D 题目大意 一棵树,每次询问kkk个点,删除mmm个点要这些点两两不连通,求mmm的最小值. 解题思路 我们可以 ...

  6. 数据结构课程设计-神秘国度的爱情故事-LCA:tarjan+离线/树链剖分/暴力

    1.无脑暴力dfs:   O(n*m) 2.LCA/tarjan+离线处理: O(n+m) 3.LCA/树链剖分: O(nlogn+m)~O(nlogn+mlogn) 4.LCA/倍增思想(有空再补) ...

  7. 洛谷P3379 【模板】最近公共祖先(LCA)

    洛谷P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数 ...

  8. 洛谷 - P3379 【模板】最近公共祖先(LCA)(RMQ求LCA/Tarjan求LCA)

    题目链接:点击查看 题目大意:给出一棵 n 个点组成的有根树,再给出 m 次询问,每次询问需要回答点 x 和点 y 的 lca 题目分析:今天新学了两种蛮有意思的求 LCA 的方法,总结一下四种方法各 ...

  9. 最近公共祖先(LCA)

    最近公共祖先 向上标记法 树上倍增 Tarjan发明的算法 转化为求区间最小值问题 最近公共祖先问题是树中的常考问题,比如我们有一棵树(可以是多叉的),两个点的最近公共祖先就是字面的意思,比如说6.5 ...

  10. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释...

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

最新文章

  1. python系统问题
  2. c语言主程序子程序流程图,c语言超经典矩阵式键盘的接法,流程图和扫描程序
  3. 在Red Hat Linux中自动运行程序
  4. 让Python pip下载速度加速
  5. 前端学习(3196):虚拟dom和真实dom
  6. CentOS 6、7 安装 Golang
  7. 刷leetcode第五题-最长回文字符串
  8. MyBatis association的两种形式——MyBatis学习笔记之四
  9. HDU2028 Lowest Common Multiple Plus【入门】
  10. 大量字段表单在PHP便捷处理分享
  11. 原子性 - synchronized关键词
  12. eclipse编译Duet固件的完整过程
  13. 关系数据库理论:范式判断、函数依赖、无损分解、正则覆盖
  14. vue清除地址栏参数
  15. 为什么微信付款服务器异常,微信付款怎么老是交易异常怎么回事?可能是这些原因...
  16. electron 修改修改应用默认图标
  17. openGauss数据库开发调试工具指导
  18. 【转】模糊测试(fuzzing)是什么
  19. 普渡大学计算机图形,普渡大学计算机图形学技术研究生语言及申请要求-费用-课程设置...
  20. NOIP是什么?全国青少年信息学奥林匹克联赛各区特派员联系名单大全!

热门文章

  1. [渝粤教育] 西南科技大学 西方现代派文学 在线考试复习资料
  2. Docker系列(五)实战:在容器中部署静态网站
  3. 线性规划 (一) 线性规划的基本形式及各种概念
  4. 迁移学习和数据扩充(附代码)
  5. 求解偏微分方程开源有限元软件deal.II学习--Step 37
  6. 浅议基因测序技术的代际:后记
  7. 【算法与数据结构】二叉堆和优先队列 Priority Queue
  8. ACM_栈的压入、弹出序列
  9. Chapter 1: Motion Blur
  10. POJ2115 C Looooops 扩展欧几里德