求助
查看原帖
求助
742246
nice333楼主2024/6/23 21:20
#include<bits/stdc++.h>
using namespace std;
#define int long long
//#define ll long long
#define pii pair<int,int>
#define vec vector
const int N = 200005;
int mod =  998244353;
void solve(){
    int n,root,m;cin>>n>>m>>root;
    vec<vec<int>>g(n+1,vec<int>(0));
    int u,v;
    for(int i=1;i<n;i++){
        cin>>v>>u;
        g[u].emplace_back(v);
        g[v].emplace_back(u);
    }
    vec<int>idx(n+1,0),deep(n+1,0),f(n+1);
    int cnt=0;
    int maxlg=__lg(n);
    vec<vec<int>>rmq(n+1,vec<int>(maxlg+1));
    vec<int>lg(n+1,0);
    function<void(int,int)>get_dfn=[&](int no,int fa){
        idx[no]=++cnt;
        rmq[cnt][0]=no;
        deep[no]=deep[fa]+1;
        f[no]=fa;
        for(int so:g[no]){
            if(so==fa)continue;
            get_dfn(so,no);
        }
    };
    get_dfn(root,0);
    for(int i=0;i<=maxlg;i++)lg[1<<i]=i;
    for(int i=3;i<=n;i++)
        if(lg[i]==0)
            lg[i]=lg[i-1];
    int le=1;
    for(int len=1;len<=maxlg;len++){
        for(int i=1;i+le*2-1<=n;i++){
            u=rmq[i][len-1];v=rmq[i+le][len-1];
            if(deep[u]<deep[v])rmq[i][len]=u;
            else rmq[i][len]=v;
        }
    }
    function<int(int,int)>get_lca=[&](int x,int y){
        if(x==y)return x;
        if(idx[x]>idx[y])swap(x,y);
        int ml=lg[idx[y]-idx[x]];
        u=rmq[idx[x]+1][ml];v=rmq[idx[y]-(1<<ml)+1][ml];
        if(deep[u]<deep[v])return f[u];
        return f[v];
    };
    while(m--){
        int q,w;cin>>q>>w;
        cout<<get_lca(q,w)<<"\n";
    }

}
signed main()
{
    
    cin.tie(0)->sync_with_stdio(0);
    int _=1;
    //cin>>_;
    for(int i=1;i<=_;i++){
        solve();
    }
    return 0;
}
2024/6/23 21:20
加载中...