建议加强数据
查看原帖
建议加强数据
173056
_Veritas楼主2021/6/16 11:36

RT

O(MN)O(MN) 暴力不吸氧 最慢的点878ms,时限1.5s

https://www.luogu.com.cn/record/51826312


#include<iostream>
#include<cstdio>
using namespace std;
const int N=500005;
inline int read(){
	int x=0;char c=getchar();
	while(c<'0'||c>'9') c=getchar();
	while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
	return x;
}
int n,m,s,head[N],to[N<<1],nxt[N<<1],cnt,f[N],dep[N];
inline void add(int x,int y){to[++cnt]=y;nxt[cnt]=head[x];head[x]=cnt;return;}
void dfs(int x){
	for(int i=head[x];i;i=nxt[i]) if(to[i]!=f[x]){
		f[to[i]]=x;dep[to[i]]=dep[x]+1;
		dfs(to[i]);
	}
}
int lca(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	while(dep[x]>dep[y]) x=f[x];
	while(x!=y)	x=f[x],y=f[y];
	return x;
}
int main(){
	n=read();m=read();s=read();
	for(int i=1,x,y;i<n;++i){x=read();y=read();add(x,y);add(y,x);}
	f[s]=s;dfs(s);
	for(int i=1,x,y;i<=m;++i){x=read();y=read();printf("%d\n",lca(x,y));}
}
2021/6/16 11:36
加载中...