hack出错了,求调,玄一关
查看原帖
hack出错了,求调,玄一关
745185
Xiang_Tiger楼主2024/7/12 09:03

用的是倍增

#include<bits/stdc++.h>
using namespace std;
int n,m,s,Lca;
vector<int > G[500001];
int dep[500001],fa[500001][21];
void dfs(int u,int f)
{
	for(int i=0;i<G[u].size();i++)
	{
		int v = G[u][i];
		if(v==f)continue;
		dep[v]=dep[u]+1;
		fa[v][0] = u;
		dfs(v,u);
	}
}
int lca(int u,int v)
{
	if(dep[v]<dep[u])swap(u,v);
	for(int i=0;i<=20;i++)
	{
		if(((dep[v]-dep[u])>>i)&1)v = fa[v][i];
	}
	if(u==v) return u;
	for(int i=20;i>=0;i--)
	{
		if(fa[u][i]==fa[v][i])continue;
		u = fa[u][i];
		v = fa[v][i];
	}
	return fa[u][0];
}
int main()
{
	cin>>n;
	s = 0;
	for(int i=1;i<=n-1;i++)
	{
		int u;
		cin>>u;
		G[u].push_back(i);
	}
	dfs(s,0);
	for(int i=1;i<=20;i++)
	{
		for(int u=1;u<=n;u++)
		{
			fa[u][i] = fa[fa[u][i-1]][i-1];
		}
	}
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		int x,y,k;
		cin>>k;
		cin>>y;
		cin>>x;
		Lca = lca(x,y);
		for(int j=3;j<=k;j++)
		{
			cin>>x;
			Lca = lca(Lca,x);
		}
		cout<<Lca<<endl;
	}
	return 0;
}
2024/7/12 09:03
加载中...