RMQ求调,感谢大佬~~~
查看原帖
RMQ求调,感谢大佬~~~
749959
the_night楼主2022/11/4 10:04
#include <bits/stdc++.h>
using namespace std;
#define N 500001
int n,m,s;
struct list{
    int to[N],nxt[N],head[N],tot;
    void add(int a,int b){
        to[++tot]=b;
        nxt[tot]=head[a];
        head[a]=tot;
    }
}G;
int cnt=0,pos[N],dep[N],seq[N],vis[N];
void dfs(int u,int d){
    seq[++cnt]=u;
    pos[u]=cnt;
    dep[cnt]=d;
    vis[u]=1;
    for(int i=G.head[u];i;i=G.nxt[i]){
        int v=G.to[i];
        if(vis[v]) continue;
        dfs(v,d+1);
        seq[++cnt]=u;
        dep[cnt]=d;
    }
}
int lg[N];
void log_find(){
    lg[0]=-1;
    for(int i=1;i<=cnt;i++){
        lg[i]=(i&(i-1))?lg[i-1]:lg[i-1]+1;
    }
}
int f[20][N];
void ST_create(){
    for(int i=1;i<=cnt;i++){
        f[0][i]=i;
    }
    int k=lg[cnt];
    for(int j=1;j<=k;j++){
        for(int i=1;i<=cnt-(1<<j)+1;i++){
            f[j][i]=(dep[f[j-1][i]])<dep[f[j-1][i+(1<<(j-1))]]?f[j-1][i]:f[j-1][i+(1<<(j-1))];
        }
    }
}
int RMQ_query(int l,int r){
    int k=lg[r-l+1];
    return (dep[f[k][l]]<dep[f[k][r-(1<<k)+1]])?f[k][l]:f[k][r-(1<<k)+1];
}
int LCA(int u,int v){
    int l=pos[u],r=pos[v];
    if(l>r) swap(l,r);
    return seq[RMQ_query(l,r)];
}
int main(){
    cin>>n>>m>>s;
    for(int i=1,u,v;i<n;i++){
        cin>>u>>v;
        G.add(u,v);
        G.add(v,u);
    }
    dfs(s,1);
    ST_create();
    for(int i=1,u,v;i<=m;i++){
        cin>>u>>v;
        cout<<LCA(u,v)<<endl;
    }

    return 0;
} 
2022/11/4 10:04
加载中...