zoukankan      html  css  js  c++  java
  • 愚蠢的LCAAAAA~~~~(>_<)~~~~

    很愤怒!特别愤怒!超级愤怒!!!

    我LCA居然错了!!而且是那种特别愚蠢的错误

    我把代码都交错了!!!

    silasila

    话不多说,代码上特别详细了

     1 #include<bits/stdc++.h>
     2 #define FOR(i,a,b) for(register int i=a;i<=b;i++)
     3 #define ROF(i,a,b) for(register int i=a;i>=b;i--)
     4 using namespace std;
     5 const int N=100000+10;
     6 int n,m,s;
     7 int scan()
     8 {
     9     int as=0,f=1;
    10     char c=getchar();
    11     while(c>'9'||c<'0'){if(c=='-') f=-1;c=getchar();}
    12     while(c>='0'&&c<='9'){as=(as<<3)+(as<<1)+c-'0';c=getchar();}
    13     return as*f;
    14 }
    15 struct ss
    16 {
    17     int now,next;
    18 }b[N*2];
    19 int num=1;
    20 int deep[N],fa[N][22],lg[N],head[N];
    21 void add(int x,int y)
    22 {
    23     num++;
    24     b[num].next =head[x];
    25     b[num].now=y;
    26     head[x]=num; 
    27 }
    28 void dfs(int f,int father)
    29 {
    30     deep[f]=deep[father]+1;//根节点的深度
    31     fa[f][0]=father;//表明该f的最直接祖先是father
    32     for(int i=1;(1<<i)<=deep[f];i++)//小于该深度啊...
    33     {
    34         fa[f][i]=fa[fa[f][i-1]][i-1];//他的祖先是祖先的祖先啊,我们是从
    35 //上往下走的,所以关于他的祖先的祖先也是早就求出来的
    36     }
    37     for(int i=head[f];i;i=b[i].next)//找儿子!!
    38     {
    39         int j=b[i].now ;
    40         if(j!=father)
    41             dfs(b[i].now,f);//找儿子,木有毛病啊
    42     }
    43 }
    44 int lca(int x,int y)
    45 {
    46     if(deep[x]<deep[y])
    47         swap(x,y);//是x成为层数深的那个
    48     ROF(i,20,0)
    49     {
    50         if(deep[fa[x][i]]>=deep[y]) x=fa[x][i];
    51             if(x==y) return x;//此时就找到了!!
    52     }
    53 //    if(x==y) return x;//此时就找到了!!
    54     for(int k=20;k>=0;k--)
    55     {
    56         if(fa[x][k]!=fa[y][k])//父亲不同就同时往上跳
    57         {
    58             x=fa[x][k];
    59             y=fa[y][k];
    60         }
    61     }
    62     return fa[x][0];//此时xy的父节点相同,所以该点直接的父亲结点就是LCA
    63 }
    64 int main()
    65 {
    66 //    freopen("lca.in","r",stdin);
    67 //    freopen("lca.out","w",stdout);
    68     n=scan();
    69     FOR(i,1,n)
    70      {
    71         int x,y;
    72         x=scan();
    73         if(x==0) {s=i;}
    74           add(x,i);
    75            //add(i,x);//储存撒
    76     }
    77     dfs(s,0);//s是0结点的儿子..
    78     m=scan();
    79     int lst=0;
    80     FOR(i,1,m)
    81     {
    82     int x,y;
    83     x=scan();y=scan();x=x^lst;y=y^lst;
    84     lst=lca(x,y);
    85     printf("%d
    ",lst);
    86     }
    87     return 0;
    88  } 

    silasila

  • 相关阅读:
    centos6 下erlang安装
    待研究
    关键字拦截查询
    获取CNVD的cookie
    adb pull 文件夹到电脑
    Linux中查看端口占用情况
    Running Tensorflow on AMD GPU
    验证码识别相关文章
    conda和pip相关操作
    windows安装pycrypto报错
  • 原文地址:https://www.cnblogs.com/KSTT/p/10374975.html
Copyright © 2011-2022 走看看