TLE 2个点求助!
查看原帖
TLE 2个点求助!
276420
__nullptr__attr楼主2020/10/28 11:35

rt,不知道哪里出问题了

#include<bits/stdc++.h>
using namespace std;
const int size=1000010;
int n,m,s;
int ver[size],head[size],nxt[size],tot=0,t;
int fa[size>>1][25],dep[size>>1],lg[size>>1];
inline void add(int x,int y){
	ver[++tot]=y,nxt[tot]=head[x],head[x]=tot;
}
void dfs(int x,int f){
	dep[x]=dep[f]+1;
	fa[x][0]=f;
	for(int i=1;i<=t;++i) fa[x][i]=fa[fa[x][i-1]][i-1];
	for(int i=head[x];i;i=nxt[i]) if(ver[i]!=f) dfs(ver[i],x);
}
inline int LCA(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	while(dep[x]>dep[y]) x=fa[x][lg[dep[x]-dep[y]]-1];
	if(x==y) return x;
	for(int k=t;k>=0;--k) if(fa[x][k]!=fa[y][k]) x=fa[x][k],y=fa[y][k];
	return fa[x][0];
}
int main(){
	ios::sync_with_stdio(0);
	cin>>n>>m>>s;
	t=log(n)/log(2)+1;
	for(int i=1;i<=n-1;++i){
		int x,y;
		cin>>x>>y;
		add(x,y),add(y,x);
	}
	for(int i=1;i<=n;++i) lg[i]=lg[i-1]+(1<<lg[i-1]==1);
	dfs(s,0);
	for(int i=1;i<=m;++i){
		int x,y;
		cin>>x>>y;
		cout<<LCA(x,y)<<'\n';
	}
	return 0;
}
2020/10/28 11:35
加载中...