题目描述
如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。
输入格式
第一行包含三个正整数 N,M,SN,M,S,分别表示树的结点个数、询问的个数和树根结点的序号。
接下来 N-1N−1 行每行包含两个正整数 x, yx,y,表示 xx 结点和 yy 结点之间有一条直接连接的边(数据保证可以构成树)。
接下来 MM 行每行包含两个正整数 a, ba,b,表示询问 aa 结点和 bb 结点的最近公共祖先。
输出格式
输出包含 MM 行,每行包含一个正整数,依次为每一个询问的结果。
趁着假期打一波板子,提神醒脑
注意代码第21行是 fx[lg[i-1]+1]==i 而不是 fx[lg[i-1]+1]=i 。
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+5;
int head[maxn],cnt,root,fx[21],lg[maxn],f[maxn][21],dep,depth[maxn],n,m,s;
struct T
{
int to,nxt;
}edge[2*maxn];
void add(int from,int to)
{
edge[++cnt].to=to;
edge[cnt].nxt