为什么会RE......
查看原帖
为什么会RE......
238174
书雪楼主2021/8/4 18:56

rt,本地下的样例没有异常,交上去就是0分

尝试了很多种方法都没有效果

#include<bits/stdc++.h>
//#define ll long long
//#define il inline
using namespace std;
/*il int read(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
il void write(int x){
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+'0');
}*/
const int N=1000010;
int dep[N],fa[N][25],cnt,head[N];
struct node{
	int to,next;
}e[N*2];
int add_(int u,int v){
	cnt++;
	e[cnt].to=v;
	e[cnt].next=head[u];
	head[u]=cnt;
}
void dfs(int x, int father121){
    dep[x]=dep[father121]+1;
    fa[x][0]=father121;
    for(int i=1;(1<<i)<=dep[x];++i){
    	fa[x][i]=fa[fa[x][i-1]][i-1];
	}
    for(int i=head[x];i;i=e[i].next){
    	if(e[i].to!=father121){
    		dfs(e[i].to,x);
		}
	}
}
int lca(int x,int y){
    if(dep[x]>dep[y]){
    	swap(x,y);
	}
    for(int i=20;~i;i--){
    	if(dep[y]-(1<<i)>=dep[x]){
    		y=fa[y][i];
		}
	}
    if(x==y){
    	return x;
	}
    for(int i=20;~i;i--){
    	if(fa[x][i]!=fa[y][i]){
    		x=fa[x][i];
			y=fa[y][i];
		}
	}
    return fa[x][0];
}
int main(){
	int n,m,s;
    scanf("%d%d%d",&n,&m,&s);
    for(int i=1;i<n;i++){
    	int u,v;
        scanf("%d%d",&u,&v);
        add_(u,v);
        add_(v,u);
    }
    dfs(s,0);
    for(int i=1;i<=m;i++){
		int a,b;
        scanf("%d%d",&a,&b);
        printf("%d\n",lca(a,b));
    }
    return 0;
}

2021/8/4 18:56
加载中...