LCA板子题

#include <bits/stdc++.h>
/*
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
*/
using namespace std;

const double eps = 1e-10;
const double pi = 3.1415926535897932384626433832795;
const double eln = 2.718281828459045235360287471352;

#define f(i, a, b) for (int i = a; i <= b; i++)
#define scan(x) scanf("%d", &x)
#define mp make_pair
#define pb push_back
#define lowbit(x) (x&(-x))

#define fi first
#define se second
#define SZ(x) int((x).size())
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define summ(a) (accumulate(all(a), 0ll))

typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef vector<int> vi;

using ll=long long;

ll n,m,s,fa[500009][21],d[500009],lg[500009];
vi g[500009]; 

void dfs(int u,int pre,int dep){
    fa[u][0]=pre,d[u]=dep;
    for(int i=1;i<=lg[d[u]];++i)fa[u][i]=fa[fa[u][i-1]][i-1];
    for(auto it:g[u])if(it!=pre)dfs(it,u,dep+1);
}

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]]];
    if(x==y)return x;
    for(int k=lg[d[x]];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(false);
    cin.tie(0);
    cin>>n>>m>>s;
    for(int i=2;i<=n;++i)lg[i]=lg[i>>1]+1;

    for(int i=1,x,y;i<n;++i){
        cin>>x>>y;
        g[x].push_back(y),g[y].push_back(x);
    }
    dfs(s,0,1);
    for(int i=1,x,y;i<=m;++i){
        cin>>x>>y;
        cout<<LCA(x,y)<<"\n";
    }

    return 0;
}
此文章已被阅读次数:正在加载...更新于