70pts,其余TLE,代码求调(悬一关)
查看原帖
70pts,其余TLE,代码求调(悬一关)
749175
114514xxx楼主2024/7/24 14:15
#include<bits/stdc++.h>
using namespace std;
int n,m,s;
const int N=1500001;
int read(){
    int x=0;char c=getchar();
    while(!isdigit(c))c=getchar();
    while(isdigit(c)){
        x=(x<<1)+(x<<3)+(c^48);
        c=getchar();
    }
    return x;
}
struct edge{
    int nxt,to;
}edge[N];
int cnt,head[N];
void add(int x,int y){
    edge[++cnt].to=y;
    edge[cnt].nxt=head[x];
    head[x]=cnt;
}
int fa[N][35],d[N],lg[N];
void dfs(int now,int fath){
	for(int i = 1; i <= n; ++i)
		lg[i]=lg[i-1] + (1<<lg[i-1]==i);
    fa[now][0]=fath;d[now]=d[fath]+1;
	for(int i=1; i<=lg[d[now]]; ++i)
		fa[now][i] = fa[fa[now][i-1]][i-1];
    for(int i=head[now];i;i=edge[i].nxt)
        if(edge[i].to!=fath)dfs(edge[i].to,now);
}
int LCA(int x,int y){
	if(d[x] < d[y]) swap(x, y);
	while(d[x] > d[y])
		x = fa[x][lg[d[x]-d[y]]-1];
               //[lg[d[x]-d[y]]-1]
	if(x == y) return x;
	for(int k=lg[d[x]]-1;k>=0;--k)
  //    int k=lg[d[x]]-1;k>=0;k--
		if(fa[x][k]!=fa[y][k])
			x=fa[x][k],y=fa[y][k];
/*
        if(fa[x][k]!=fa[y][k])
            x=fa[x][k],y=fa[y][k];
*/
	return fa[x][0];
}
int main(){
    cin>>n>>m>>s;
    int x,y;
    for(int i=1;i<=n-1;++i){
        x=read();y=read();
        add(x,y);add(y,x);
    }
    dfs(s,0);
    for(int i=1;i<=m;i++){
        x=read();y=read();
        int k=LCA(x,y);
        printf("%d\n",k);
    }
    return 0;
}

2024/7/24 14:15
加载中...