【模板】最近公共祖先(LCA)-倍增/st表/tarjan算法


Submit solution

Points: 100
Time limit: 2.0s
Memory limit: 500M

Author:
Problem type
Allowed languages
C, C++

【模板】最近公共祖先(LCA)

题目描述

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

输入格式

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

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

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

输出格式

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

输入输出样例 #1

输入 #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

说明/提示

对于 \(30\%\) 的数据,\(N\leq 10\),\(M\leq 10\)。

对于 \(70\%\) 的数据,\(N\leq 10000\),\(M\leq 10000\)。

对于 \(100\%\) 的数据,\(1 \leq N,M\leq 5\times10^5\),\(1 \leq x, y,a ,b \leq N\),不保证 \(a \neq b\)。

样例说明:

该树结构如下:

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

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

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

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

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

故输出依次为 \(4, 4, 1, 4, 4\)。


Comments

There are no comments at the moment.