社区讨论

求调(LCA倍增)

P3379【模板】最近公共祖先(LCA)参与者 5已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mdxqehw9
此快照首次捕获于
2025/08/05 07:18
7 个月前
此快照最后确认于
2025/08/05 12:11
7 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll an[200001][25],n,m,s,lg[200001],a,b,d[200001],k;
vector<ll>v[200001];
void dfs(ll u,ll fa){
	d[u]=d[fa]+1;
	an[u][0]=fa;
	for (ll i=1;(1<<i)<=d[u];i++) an[u][i]=an[an[u][i-1]][i-1];
	for (ll i=0;i<v[u].size();i++) if (v[u][i]!=fa) dfs(v[u][i],u);
}
ll lca(ll x,ll y){
	if (d[x]<d[y]) swap(x,y);
	while (d[x]>d[y]) x=an[x][lg[d[x]-d[y]]];
	if (x==y) return x;
	for (ll i=lg[d[x]];i>=0;i--)
	if (an[x][i]!=an[y][i]){
		x=an[x][i];
		y=an[y][i];
	}
	return an[x][0];
}
int main(){
	cin>>n>>m>>s;
	for (ll i=1;i<n;i++){
		cin>>a>>b;
		v[a].push_back(b);
		v[b].push_back(a);
	}
	lg[0]=-1;
	for (ll i=1;i<=n;i++) lg[i]=lg[i>>1]+1;
	dfs(s,0);
	while (m--){
		cin>>a>>b;
		cout<<lca(a,b)<<'\n';
	}
}
Subtask11-13TLE了,帮忙看看

回复

5 条回复,欢迎继续交流。

正在加载回复...