洛谷P3398 仓鼠找sugar

裸的LCA。

对于每次询问,设a,b的LCA为A,c,d的LCA为B,分两种情况讨论:

1)A与B的深度相同,此时二人相遇的充要条件为A==B,即四个点的最近公共祖先相同。

2 ) A与B深度不同,设A的深度大于B的深度,若二人相遇,则c或d与A的LCA一定为A。

#include
#include
#define maxn 100005
inline int fread(void){
    char c;int num=0;
    while((c=getchar())==' '||c=='\r'||c=='\n');
    num+=c-'0';
    while((c=getchar())>='0'&&c<='9')
        num=num*10+c-'0';
    return num;
}
inline void swap(int &a,int &b){
    a^=b;b^=a;a^=b;
    return;
}
int n,q,fa[maxn][20],deep[maxn];
std::vectorsons[maxn];
inline void dfs(int u,int f,int dep){
    deep[u]=dep;fa[u][0]=f;
    int v,mx=sons[u].size();
    for(int i=0;ideep[b]
    int i,j;
    for(i=0;(1<=0;--j)
        if(deep[a]-(1<=deep[b])
            a=fa[a][j];
    if(a==b)return a;
    for(j=i;j>=0;--j)
        if(fa[a][j]!=fa[b][j]&&fa[a][j]!=0)
            a=fa[a][j],b=fa[b][j];
    return fa[a][0];
}
int main(){
	//freopen("a.in","r",stdin); 
    int i,j,k,x,y,a,b,c,d;
    n=fread();q=fread();
    for(i=0;ideep[B]
        if(lca(c,A)==A) printf("Y\n");
        else if(lca(d,A)==A) printf("Y\n");
        else printf("N\n");//case 2
        --q;
    }
    return 0;
}

你可能感兴趣的:(数据结构,树上倍增,LCA)