一觉醒来倍增过不去了?????
查看原帖
一觉醒来倍增过不去了?????
336603
出言不逊王子楼主2022/9/27 22:36
#include<bits/stdc++.h>
#define ns "-1"
#define fs(i,x,y,z) for(ll i=x;i<=y;i+=z)
#define ft(i,x,y,z) for(ll i=x;i>=y;i+=z)
#define ll long long
#define ull unsigned long long
#define db double
#define ms(a,b) memset(a,b,sizeof(a))
#define sz(a) sizeof(a)
using namespace std;
const int N=700001,inf=0x7f7f7f7f;
vector<int> sons[N];
int dep[N],lga[N],n,m,s,fa[N][22];
void add(int s,int t){
    sons[s].push_back(t);
}
void init(int to){
    for(int i=1;i<=to;i++){
        lga[i]=lga[i-1];
        if(i==1<<lga[i-1]) lga[i]++;
    }
}
void dfs(int now,int fanow){
    dep[now]=dep[fanow]+1;
    fa[now][0]=fanow;
    for(int i=1;(1<<i)<=dep[now];i++){
        fa[now][i]=fa[fa[now][i-1]][i-1];
    }
    for(int i=0;i<sons[now].size();i++){
        if(sons[now][i]!=fanow){
            dfs(sons[now][i],now);
        }
    }
}
int lca(int x,int y){
    if(dep[x]<dep[y]) swap(x,y);
    while(dep[x]>dep[y]) x=fa[x][lga[dep[x]-dep[y]]-1];
    if(x==y) return x;
    for(int i=lga[x];i>=0;i--){
        if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
    }
    return fa[x][0];
}
inline int read(){
	int date=0,w=1;char c=0;
	while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
	while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
	return date*w;
}
int main(){
	n=read();m=read(),s=read();
	init(n);
	for(int i=1;i<n;i++){
		int x,y;x=read(),y=read();
		add(x,y);
		add(y,x);
	}
	dfs(s,0);
	for(int i=1;i<=m;i++){
		int x,y;x=read(),y=read();
		printf("%d\n",lca(x,y));
	}
	return 0;
}

WA On #13#14

2022/9/27 22:36
加载中...