树剖(重剖)TLE 求条
查看原帖
树剖(重剖)TLE 求条
322792
Alea楼主2023/11/2 09:25
#include <iostream>
#include <vector>
using namespace std;
const int SIZE=5e5+10;
int n,m,s;
struct edg{
    int u,v;
    edg(int u=0,int v=0):u(u),v(v){}
}edge[2*SIZE];
vector<int> edgc[SIZE];
int siz[SIZE],dep[SIZE],fh[SIZE];
int wson[SIZE],dfn[SIZE],nfd[SIZE],toch[SIZE],dft;
void dfs(int u,int fa){
    siz[u]=1,dep[u]=dep[fa]+1,fh[u]=fa;
    for(int it:edgc[u]){
        int v=edge[it].v;
        if(v==fa) continue;
        dfs(v,u);
        siz[v]+=siz[u];
        if(siz[wson[u]]<siz[v]) wson[u]=v;
    }
}
void subd(int u,int top){
    dfn[u]=++dft,nfd[dft]=u,toch[u]=top;
    if(wson[u]==0) return;
    subd(wson[u],top);
    for(int it:edgc[u]){
        int v=edge[it].v;
        if(v==fh[u]||v==wson[u]) continue;
        subd(v,v);
    }
}
int main(){
    cin>>n>>m>>s;
    for(int i=1;i<n;i++){
        int x,y;
        cin>>x>>y;
        edge[i]=edg(x,y);
        edgc[x].push_back(i);
        edge[i+n]=edg(y,x);
        edgc[y].push_back(i+n);
    }
    dfs(s,s),subd(s,s);
    while(m--){
        int u,v;
        cin>>u>>v;
        while(toch[u]!=toch[v]){
            if(dep[toch[u]]<dep[toch[v]]) swap(u,v);
            u=fh[toch[u]];
        }
        if(dep[u]>dep[v]) swap(u,v);
        cout<<u<<endl;
    }
    return 0;
}
2023/11/2 09:25
加载中...