WA+MLE 64pts求调
查看原帖
WA+MLE 64pts求调
1046406
Unpt_V3楼主2025/1/25 13:59

WA on #1 #3 #8
MLE on #7

#include <bits/stdc++.h>

using namespace std;

struct edge {
    int v, idx;
};

const int N = 5e4 + 5;
int n, m, tot, dfn[N], low[N], bl[N], ind, cnt;
int dep[N], anc[N][20];
bool vis[N], brg[N], vis2[N];
vector<edge> p[N];
vector<int> g[N];
stack<int> st;

void tarjan(int u, int ine) {
    low[u] = dfn[u] = ++ind;
    st.push(u);
    for (auto &[v, idx] : p[u]) {
        if (idx == ine) continue;
        if (!dfn[v]) {
            tarjan(v, idx);
            low[u] = min(low[u], low[v]);
            if (low[v] > dfn[u])
                brg[idx] = true;
        } else if (vis[v])
            low[u] = min(low[u], dfn[v]);
    }
}

void dfs1(int u) {
    vis2[u] = true;
    bl[u] = tot;
    for (auto &[v, idx] : p[u]) {
        if (vis2[v]) continue;
        if (brg[idx]) continue;
        dfs1(v);
    }
}

void dfs2(int u, int fa) {
    for (auto v : g[u]) {
        if (v == fa) continue;
        dep[v] = dep[u] + 1;
        anc[v][0] = u;
        dfs2(v, u);
    }
}

void init() {
    for (int k = 1; k <= 14; k++)
        for (int i = 1; i <= n; i++)
            anc[i][k] = anc[anc[i][k - 1]][k - 1];
}

int lca(int x, int y) {
    if (dep[x] < dep[y]) swap(x, y);
    for (int i = 14; i >= 0; i--)
        if (dep[anc[x][i]] >= dep[y]) {
            x = anc[x][i];
        }
    if (x == y) return x;
    for (int i = 14; i >= 0; i--)
        if (anc[x][i] != anc[y][i])
            x = anc[x][i], y = anc[y][i];
    return anc[x][0];
}

string to_b(int x) {
    string res;
    while (x) res += (char)(x % 2 + '0'), x /= 2;
    reverse(res.begin(), res.end());
    return res;
}

int main() {
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int u, v;
        cin >> u >> v;
        p[u].push_back({v, i});
        p[v].push_back({u, i});
    }

    for (int i = 1; i <= n; i++)
        if (!dfn[i]) tarjan(i, 0);
    for (int i = 1; i <= n; i++)
    if (!vis2[i]) tot++, dfs1(i);
    
    for (int i = 1; i <= n; i++)
        for (auto &[j, idx] : p[i]) {
            int u = bl[i], v = bl[j];
            if (u != v) g[u].push_back(v);
        }

    dep[1] = 1;
    dfs2(1, 0), init();

    cin >> cnt;
    while (cnt--) {
        int x, y;
        cin >> x >> y;
        int u = bl[x], v = bl[y];
        int ac = lca(u, v);
        int ans = (dep[u] - dep[ac]) + (dep[v] - dep[ac]) + 1;
        cout << to_b(ans) << endl;
    }
    return 0;
}
2025/1/25 13:59
加载中...