求调LCA
  • 板块学术版
  • 楼主KυρωVixen
  • 当前回复6
  • 已保存回复6
  • 发布时间2023/1/18 15:26
  • 上次更新2023/10/24 03:43:37
查看原帖
求调LCA
765382
KυρωVixen楼主2023/1/18 15:26
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+3; 
int dep[N],anc[N][22],lg[N],n,m,s;
vector<int> G[N];
void dfs(int now,int lst){
	dep[now]=dep[lst]+1; anc[now][0]=lst;
	for(int i=1;i<=lg[dep[now]];i++)
		anc[now][i]=anc[anc[now][i-1]][i-1];
	for(int i=0;i<G[now].size();i++)
		if(G[now][i]!=lst) dfs(G[now][i],now);
}
int lca(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	while(dep[x]>dep[y])
		x=anc[x][lg[dep[x]-dep[y]]-1];
	if(x==y) return x;
	for(int i=lg[dep[x]]-1;i>=0;i--)
		if(anc[x][i]!=anc[y][i])
			x=anc[x][i],y=anc[y][i];
	return anc[x][0];
}
int main(){
	cin>>n>>m>>s;
	for(int i=1;i<=n+1;i++) lg[i]=lg[i-1]+(1<<(lg[i-1]==i)); 
	for(int i=1;i<n;i++){
		int u,v; cin>>u>>v;
		G[u].push_back(v);
		G[v].push_back(u);
	}
	dfs(s,-1);
	for(int i=0;i<m;i++){
		int t1,t2; cin>>t1>>t2;
		cout<<lca(t1,t2)<<endl;
	}
}

全TLE+WA没救,求问题

2023/1/18 15:26
加载中...