zoukankan      html  css  js  c++  java
  • P3379 【模板】最近公共祖先(LCA)(倍增)

    这题有毒!!!!!!!!!!

    TM我重新打的板子,然而。。。。。。

    5分钟打完 debug两小时

    我的写法常数太大了

    每次DFS都要For去更新F

    最后写了快读才A

    改:

    只处理f[i][0]

    dfs结束在处理f

    整整快了一倍多!!!!!!!!

    靠!!

    烦。。。。

    #include<cstdio>
    #include<iostream>
    using namespace std;
    #define olinr return
    #define love_nmr 0
    #define nmr 505050
    struct node
    {
        int nxt,to;
    }edge[nmr<<1];
    int head[nmr];
    int n;
    int m;
    int root;
    int f[nmr][35];
    int dep[nmr];
    int cnt;
    inline int read()
    {
        char ch=getchar();
        int x=0,f=1;
        while(!isdigit(ch))
        {
            if(ch=='-')
                f=-f;
            ch=getchar();
        }
        while(isdigit(ch))
        {
            x=(x<<1)+(x<<3)+(ch^48);
            ch=getchar();
        }
        return x*f;
    }
    inline void put(int x)
    {
        if(x<0)
        {
            putchar('-');
            x=-x;
        }
        if(x>9)
            put(x/10);
        putchar(x%10+'0');
    }
    inline void add(int from,int to)
    {
        cnt++;
        edge[cnt].to=to;
        edge[cnt].nxt=head[from];
        head[from]=cnt;
    }
    inline void dfs(int x,int fa)
    {
        dep[x]=dep[fa]+1;
        f[x][0]=fa;
        for(int i=head[x];i;i=edge[i].nxt)
        {
            int go=edge[i].to;
            if(go!=fa)
                dfs(go,x);
        }
    }
    inline void swap(int &x,int &y)
    {
        int t=x; x=y; y=t;
    }
    inline int LCA(int x,int y)
    {
        if(dep[x]<dep[y]) swap(x,y);
        for(int i=30;i>=0;i--)
            if(dep[x]-(1<<i)>=dep[y])
                x=f[x][i];
        if(x==y) olinr x;
        for(int i=30;i>=0;i--)
            if(f[x][i]!=f[y][i])
            {
                x=f[x][i];
                y=f[y][i];
            }
        olinr f[x][0];
    }
    
    int main()
    {
           n=read();
        m=read();
        root=read();
        int x,y;
        for(int i=1;i<=n-1;i++)
        {
            x=read();
            y=read();
            add(x,y);
            add(y,x);
        }
        dfs(root,0);
        for(int j=1;(1<<j)<=n;j++)
            for(int i=1;i<=n;i++)
                f[i][j]=f[f[i][j-1]][j-1];
        for(int i=1;i<=m;i++)
        {
            x=read();
            y=read();
            put(LCA(x,y));
            putchar('
    ');
        }
        olinr love_nmr;
    } 
  • 相关阅读:
    他山之石____集合框架__【List,Set,Map之间的区别】
    集合框架__【泛型】
    集合框架__【Set集合】【HashSet】【TreeSet】
    模式串匹配,KMP算法——HDU1686
    模式串匹配,KMP算法——HDU1711
    网络最大流——POJ
    网络最大流——HDU
    拓扑排序——CodeForces-645D
    二分图染色,二分图匹配——HDU
    二分图匹配,最小点覆盖——POJ
  • 原文地址:https://www.cnblogs.com/olinr/p/9451876.html
Copyright © 2011-2022 走看看