样例全过,TLE on #1
查看原帖
样例全过,TLE on #1
1222486
TangyixiaoQAQ楼主2024/3/19 22:40
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
bool vis[N];
int T, n, m, s, x, y, root, dep[N], fa[N][22], lg[N];
vector<int> v[N];
void dfs(int u, int last) {
    dep[u] = dep[last] + 1;
    fa[u][0] = last;
    for (int i = 1; (1 << i) <= dep[u]; i++) {
        fa[u][i] = fa[fa[u][i - 1]][i - 1];
    }
    for (int i = 0; i < v[u].size(); i++) {
        if (v[u][i] != last) {
            dfs(v[u][i], u);
        }
    }
    return;
}
int LCA(int x, int y) {
    if (dep[x] < dep[y]) {
        swap(x, y);
    }
    while (dep[x] != dep[y]) {
        x = fa[x][lg[dep[x] - dep[y]] - 1];
    }
    if (x == y) {
        return x;
    }
    for (int k = lg[dep[x]]; k >= 0; k--) {
        if (fa[x][k] != fa[y][k]) {
            x = fa[x][k], y = fa[y][k];
        }
    }
    return fa[x][0];
}
inline void init(){
    v->clear();
    memset(lg,0,sizeof lg);
    memset(fa,0,sizeof fa);
    memset(vis,0,sizeof vis);
    memset(dep,0,sizeof dep);
    return;
}
inline void solve() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        lg[i] = lg[i - 1];
        if (i == 1 << lg[i - 1]) {
            lg[i]++;
        }
    }
    for (int i = 1; i <= n; i++) {
        scanf("%d", &m);
        for (int j = 1; j <= m; j++) {
            scanf("%d", &x);
            v[i].push_back(x);
            v[x].push_back(i);
            vis[x] = true;
        }
    }
    for (int i = 1; i <= n; i++) {
        if (!vis[i]) {
            root = i;
            break;
        }
    }
    dfs(root, root);
    scanf("%d", &s);
    for (int i = 1; i <= s; i++) {
        scanf("%d%d", &x, &y);
        printf("%d\n", LCA(x, y));
    }
    return;
}
signed main() {
    scanf("%d", &T);
    for (int i = 1; i <= T; i++) {
        init();
        printf("Case %d:\n", i);
        solve();
    }
    return 0;
}
2024/3/19 22:40
加载中...