【玄关】求助 54 pts
查看原帖
【玄关】求助 54 pts
923403
FallingFYC_楼主2025/8/1 22:24

记录

:::warning[错误代码]

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define REV(i,a,b) for(int i=(a);i>=(b);i--)
#define CLOSE_TIE ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define psbk push_back
#define mkp make_pair
#define endl '\n'
#define outval(x) cout<<(#x)<<'='<<x<<endl;
#define outarr(a,be,ed)\
cout<<(#a)<<'=';\
FOR(i,be,ed)cout<<a[i]<<' ';\
cout<<endl;
const int N=1e4+5;
struct Edge{int v,id;};
int n,m,q,dfn[N],low[N],bel[N],cnt,tot,fa[N][20],dep[N];
stack<int> stk;
vector<Edge> e[N];
vector<int> g[N];
void dfs(int u,int lst){
    dfn[u]=low[u]=++cnt;
    stk.push(u);
    for(Edge i:e[u]){
        int v=i.v,id=i.id;
        if(id==(lst^1)) continue;
        if(!dfn[v]){
            dfs(v,id);
            low[u]=min(low[u],low[v]);
        }else low[u]=min(low[u],dfn[v]);
    }
    if(dfn[u]==low[u]){
        ++tot;
        while(stk.top()!=u){
            bel[stk.top()]=tot; stk.pop();
        }
        bel[stk.top()]=tot; stk.pop();
    }
}
void dfs1(int u,int f){
    fa[u][0]=f; dep[u]=dep[f]+1;
    FOR(i,1,20) fa[u][i]=fa[fa[u][i-1]][i-1];
    for(int v:g[u])
        if(v!=f) dfs1(v,u);
}
int lca(int u,int v){
    if(dep[u]<dep[v]) swap(u,v);
    int dis=dep[u]-dep[v];
    FOR(i,0,20)
        if(dis&(1<<i)) u=fa[u][i];
    if(u==v) return u;
    REV(i,20,0)
        if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
    return fa[v][0];
}
signed main(){
    CLOSE_TIE
    cin>>n>>m;
    map<pair<int,int>,bool> mp;
    FOR(i,1,m){
        int x,y;
        cin>>x>>y;
        if(x>y) swap(x,y);
        if(mp[mkp(x,y)]) continue;
        mp[mkp(x,y)]=1;
        e[x].psbk({y,i<<1});
        e[y].psbk({x,i<<1|1});
    }
    FOR(i,1,n)
        if(!dfn[i]) dfs(i,0);
    mp.clear();
    FOR(u,1,n)
        for(Edge i:e[u]){
            int v=i.v;
            int bu=bel[u],bv=bel[v];
            if(bu>bv) swap(bu,bv);
            if(bu!=bv&&!mp[mkp(bu,bv)]){
                g[bu].psbk(bv); g[bv].psbk(bu);
                mp[mkp(bu,bv)]=1;
            }
        }
    FOR(i,1,tot)
        if(!dep[i]) dfs1(i,0);
    //outarr(dep,1,n);  outarr(bel,1,n);
    cin>>q;
    FOR(i,1,q){
        int x,y;
        cin>>x>>y;
        int bx=bel[x],by=bel[y];
        int ans=dep[bx]+dep[by]-2*dep[lca(bx,by)]+1;
        string s;
        while(ans){
            s+='0'+ans%2;
            ans>>=1;
        }
        reverse(s.begin(),s.end());
        cout<<s<<endl;
    }
    return 0;
}

:::

2025/8/1 22:24
加载中...