LCA板子题WA
查看原帖
LCA板子题WA
569702
_xxy_楼主2022/9/10 09:44

后两点WA了,一直调不出来。

#include<cstdio>
#include<iostream>
#include<cstring> 
using namespace std;
inline int read(){
	int x=0,f=1;
	char ac=getchar();
	while(ac<'0'||ac>'9'){
		if(ac=='-') f=-1;
		ac=getchar();
	}
	while(ac>='0'&&ac<='9'){
		x=(x<<3)+(x<<1)+(ac-'0');
		ac=getchar(); 
	}
	return x*f;
} 
int n,m,s,t[1000005],nxt[1000005],h[500005],dp[500005][18],dis[500005],cnt,log[500005];
bool vis[500005];
void add(int u,int v){
	t[++cnt]=v;
	nxt[cnt]=h[u];
	h[u]=cnt;
}
void dfs(int u){
	vis[u]=true;
	for(int i=1;(1<<i)<=dis[u];i++){
		dp[u][i]=dp[dp[u][i-1]][i-1];
	}
	for(int i=h[u];i;i=nxt[i]){
		if(vis[t[i]]) continue;
		dis[t[i]]=dis[u]+1;
		dp[t[i]][0]=u;
		dfs(t[i]);
	}
}
int LCA(int u,int v){
	if(dis[u]<dis[v]) swap(u,v);
	for(int i=log[dis[u]];i>=0;i--){
		if(dis[dp[u][i]]>=dis[v]) u=dp[u][i];
	}
	if(u==v) return u;
	for(int i=log[dis[u]];i>=0;i--){
		if(dp[u][i]!=dp[v][i]){
			u=dp[u][i],v=dp[v][i];
		}
	}
	return dp[u][0];
}
int main(){
	n=read(),m=read(),s=read();
	for(int i=1;i<n;i++){
		int u=read(),v=read();
		add(u,v);
		add(v,u);
	}
	dis[s]=1;
	dfs(s);
	for(int i=2;i<=n;i++) log[i]=log[i/2]+1;
	for(int i=1;i<=m;i++){
		int u=read(),v=read();
		printf("%d\n",LCA(u,v));
	}
	return 0;
}
2022/9/10 09:44
加载中...