subtask1 全T 倍增求lca
查看原帖
subtask1 全T 倍增求lca
829025
hrill楼主2024/5/5 17:04
#include <bits/stdc++.h>
#define ll long long
#define INF 0x7fffffff
#define mod 998244353
//#define endl "\n"
#define f(j,k) for(int i = j ; i <= k ; i++)
#define f1(j,k) for(int i = j ; i >= k ; i--)
#define exp 1e-7
#define PLL pair<ll,ll>
const ll N = 300005;
const ll P = 1000000007;
const int base = 5; 
const ll hashmod = 1e12 + 39;
using namespace std;
inline ll lowbit(ll x) {return x & -x;} 
using i64 = long long;
void solve()
{
    ll n,m,s;
    cin >> n >> m >> s;
    vector<vector<ll>> edge(n + 1);
    for(int i = 1 ; i < n ; i++)
    {
        ll u,v;
        cin >> u >> v;
        edge[u].push_back(v);
        edge[v].push_back(u);
    }
    vector<ll> dep(n + 1);
    vector<vector<ll>> fa(n + 1 , vector<ll> (35));
    function<void(ll,ll)> dfs = [&](ll now,ll father)->void{
        dep[now] = dep[father] + 1;
        fa[now][0] = father;
        for(int i = 1 ; (1 << i) <= dep[now] ; i++)
            fa[now][i] = fa[fa[now][i - 1]][i - 1];
        for(auto x : edge[now])
            if(x != father)
                dfs(x,now);
    };
    dfs(s,0);
    function<ll(ll,ll)> lca = [&](ll u,ll v)->ll{
        ll depu = dep[u],depv = dep[v];
        if(depu < depv)
        {
            swap(u,v);
            swap(depu,depv);
        }
        ll dis = depu - depv;
        if(dis)
        {
            for(int i = 0 ; i <= 20 ; i++)
            {
                if((1 << i) & dis)
                    u = fa[u][i];
            }
        }
        if(u == v)
            return u;
        for(int i = 20 ; i >= 0 ; i--)
        {
            if(dep[u] < (1 << i))
                continue;
            if(fa[u][i] != fa[v][i])
            {
                u = fa[u][i];
                v = fa[v][i];
            }
        }
        return fa[u][0];
    };
    while(m--)
    {
        ll a,b;
        cin >> a >> b;
        cout << lca(a,b) << endl;
    }
}

int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    ll _ = 1;
    while(_--)
        solve();
    return 0;
} 
2024/5/5 17:04
加载中...