求救 LCA爆炸
查看原帖
求救 LCA爆炸
181566
after_the_end楼主2020/9/18 19:44
#include<bits/stdc++.h>
using namespace std;
#define re register
int n,m,s,num1,num2,head[500001],tot,fa[500010][22],dep[500001],lg[22];
struct node{
    int next,to;
}edge[1000010];
inline void addedge(int u,int v){
    edge[++tot].next=head[u];
    edge[tot].to=v;
    head[u]=tot;
}
void dfs(int now,int fat){
    fa[now][0]=fat;dep[now]=dep[fat]+1;
//    printf("%d\n",fa[now][0]);
    for(re int i=1;i<=lg[dep[now]];++i){
        fa[now][i]=fa[fa[now][i-1]][i-1];
    }
    for(re int i=head[now];i;i=edge[i].next){
//        if(edge[i].to==fat)continue;
		if(edge[i].to!=fat)
        dfs(edge[i].to,now);
    }
}
inline int find(int x,int y){
    if(dep[y]>dep[x]){
        swap(x,y);
    }
    while(dep[x]>dep[y]){
        x=fa[x][lg[dep[x]-dep[y]]-1];
    }
    if(x==y){
        return x;
    }
    for(re int i=lg[dep[x]]-1;i>=0;--i){
        if(fa[x][i]!=fa[y][i]){
            x=fa[x][i];y=fa[y][i];
        }
    }
//    printf("%d\n",x);
    return fa[x][0];
}
int main(){
    scanf("%d%d%d",&n,&m,&s);
    for(re int i=1;i<=n-1;++i){
        scanf("%d%d",&num1,&num2);
        addedge(num1,num2);
        addedge(num2,num1);
    }
    for(re int i=1;i<=n;++i){
        lg[i]=lg[i-1]+(1<<lg[i-1]==i);
//        if(i==1<<lg[i-1])++lg[i];
    }
    dfs(s,0);
    while(m--){
        scanf("%d%d",&num1,&num2);
        printf("%d\n",find(num1,num2));
    }
    return 0;
}

交了好多次了,一直是30pts

有的点re

有的wa

有的tle

2020/9/18 19:44
加载中...