倍增lca被hack求助
查看原帖
倍增lca被hack求助
206423
焚魂楼主2024/9/18 10:31

unac100pts,最后四个数据tle

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>

using namespace std;

int n,m,root,num;
int dep[5000010],f[500010][21];
int head[1000010],tot;
struct node{
    int next,v;
}cnt[1000010];

void insert(int u,int v) {
    cnt[++tot].next = head[u];
    cnt[tot].v = v;
    head[u] = tot;
}

int Log(double x) {
    int ans = log(x)/log(2);
    return ans; 
}

void Deal_first(int u,int father) {
    dep[u] = dep[father] + 1;
    for(int i = 0;i <= num;i++) {
        f[u][i+1] = f[f[u][i]][i];
    }
    for(int i = head[u];i;i = cnt[i].next) {
        if(cnt[i].v == father) continue;
        f[cnt[i].v][0] = u;
        Deal_first(cnt[i].v,u);
    }
}

int lca(int x,int y) {
    if(dep[x] < dep[y]) swap(x,y);
    for(int i = Log(dep[x] - dep[y]) + 1;i >= 0;i--) {
        if(dep[f[x][i]] >= dep[y]) x = f[x][i];
        if(x == y) return x;
    }
    for(int i = num+1;i >= 0;i--) {
        if(f[x][i] != f[y][i]) {
            x = f[x][i];
            y = f[y][i];
        }
    }
    return f[x][0];
}

int main() {
    cin >> n >> m >> root;
    dep[root] = 1;
    num = Log((double)n) ;
    for(int i = 1;i < n;i++) {
        int x,y;
        cin >> x >> y;
        insert(x,y);
        insert(y,x);
    }

    Deal_first(root,0);

    for(int i = 1;i <= m;i++) {
        int x,y;
        cin >> x >> y;
        cout << lca(x,y) << endl;
    }

    return 0;
}
2024/9/18 10:31
加载中...