st表做法求助!!!
查看原帖
st表做法求助!!!
775577
LionoftheNorth楼主2024/6/15 17:42
#include<bits/stdc++.h>

using namespace std;

const int N=5e5+5;

int order=0;
int n,m,s,dfn[2*N],pos[N],vis[N];
int cnt,head[N],nxt[N],to[N];
int st[21][2*N],ll[2*N]{0,0,1};

void add_edge(int u,int v){
    nxt[++cnt]=head[u];
    head[u]=cnt,to[cnt]=v;
}

void dfs(int now){
    dfn[++order]=now;
    pos[now]=order;
    vis[now]=true;
    for(int i=head[now];i;i=nxt[i])
        if(!pos[to[i]]){
            dfs(to[i]);
            dfn[++order]=now;
        }
}

int main(){
    ios::sync_with_stdio(false);cin.tie(nullptr);
    cin>>n>>m>>s;
    for(int i=1,u,v;i<=n-1;i++){
        cin>>u>>v,add_edge(u,v),add_edge(v,u);
    }
    dfs(s);
    for(int i=1;i<=n;i++)
        if(!vis[i]){
            cout<<9<<endl;
            break;
        }
    for(int i=1;i<=2*n-1;i++){
        st[0][i]=pos[dfn[i]];
    }
    for(int i=3;i<2*N;i++)
        ll[i]=ll[i/2]+1;
    for(int i=1;i<=20;i++)
        for(int j=1;j<=2*n-1;j++)
                st[i][j]=min(st[i-1][j],st[i-1][j+(1<<(i-1))]);
    for(int a,b;m--;){
        cin>>a>>b;
        int l=min(pos[a],pos[b]),r=max(pos[a],pos[b]);
        int s=ll[r-l+1];
        cout<<dfn[min(st[s][l],st[s][r-(1<<s)+1])]<<'\n';
    }
    return 0;
}

大样例会输出0,似乎是有哪些点没有访问到,,不知道是不是dfs有问题..

2024/6/15 17:42
加载中...