【求卡常】臭 恶 代 码
查看原帖
【求卡常】臭 恶 代 码
104380
garbage2楼主2020/8/6 16:27

RT,竟然T了两个点,臭 恶 代 码

#include<bits/stdc++.h>
using namespace std;
struct tree
{
    int d;
    int fa[22];
    vector<int> next;
}a[500002];
int root;
int n,m;
int vis[500002];
void DFS(int now,int last)
{
/*  if(vis[now])
        return ;                //大家说是这种方法快
    vis[now]=1;
*/  a[now].d=a[last].d+1;
    a[now].fa[0]=last;
    int i;
    for(i=1;(1<<i)<=a[now].d;i++)
        a[now].fa[i]=a[a[now].fa[i-1]].fa[i-1];
    for(i=0;i<a[now].next.size();i++){
        int nt=a[now].next[i];
        if(nt!=last)            //还是这种快??
            DFS(nt,now);
    }
}
int LCA(int u,int v)
{
    int du=a[u].d,dv=a[v].d;
    int i;
    if(du!=dv){
        if(du<dv){
            swap(u,v);
            swap(du,dv);
        }
        int c=du-dv;
        for(i=0;i<=ceil(log2(n));i++)
            if((1<<i)&c)
                u=a[u].fa[i];
    }
    if(u==v) return u;
    for(i=log2(n);i>=0;i--){
        if(a[a[u].fa[i]].d<=0)
            continue;
        if(a[u].fa[i]==a[v].fa[i])
            continue;
        else{
            u=a[u].fa[i];
            v=a[v].fa[i];
        }
    }
    return a[u].fa[0];
}
int main()
{
//  memset(vis,0,sizeof(vis));
    cin>>n>>m>>root;
    int i;
    for(i=1;i<n;i++){
        int u,v;
        cin>>u>>v;
        a[u].next.push_back(v);
        a[v].next.push_back(u);
    }
    DFS(root,0);
    for(i=1;i<=m;i++){
        int u,v;
        cin>>u>>v;
        cout<<LCA(u,v)<<endl;
    }
    return 0;
}

另附O2 70分的测试

2020/8/6 16:27
加载中...