愚蠢的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

原文地址:https://www.cnblogs.com/KSTT/p/10374975.html