很愤怒!特别愤怒!超级愤怒!!!
我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