样例能过,上交全错???
查看原帖
样例能过,上交全错???
585534
SHenP楼主2022/7/9 23:13

求各位dalaodalao帮我看一下错在哪儿
样例能过,交上去全是WA

#include<cstdio>
#include<vector>
#include<cstring>
#define MAXN 500005
#define MAXLOGN 20
using namespace std;
vector<int>s[MAXN];
int dp[MAXN][MAXLOGN],h[MAXN];
void dfs(int n) {
	for(int i=0; i<s[n].size(); i++) {
		h[s[n][i]]=h[n]+1;
		dfs(s[n][i]);
	}
}
inline void jump(int &x,int d) {
	for(int i=0; d; i++) {
		if(d&1)x=dp[x][i];
		d>>=1;
	}
}
int main() {
#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
#endif
	memset(dp,-1,sizeof(dp));
	int N,M,S;
	scanf("%d %d %d",&N,&M,&S);
	for(int i=0; i<N-1; i++) {
		int x,y;
		scanf("%d %d",&x,&y);
		s[y].push_back(x);
		dp[x][0]=y;
	}
	dfs(S);
	for(int i=1; i<MAXLOGN; i++)for(int j=1; j<=N; j++)if(dp[j][i-1]>-1)dp[j][i]=dp[dp[j][i-1]][i-1];
	for(int i=0; i<M; i++) {
		int a,b;
		scanf("%d %d",&a,&b);
		if(h[a]>h[b])jump(a,h[a]-h[b]);
		else jump(b,h[b]-h[a]);
		if(a==b)printf("%d\n",a);
		else {
			for(int j=MAXLOGN-1; j>-1; j--)if(dp[a][j]!=dp[b][j]) {
					a=dp[a][j];
					b=dp[b][j];
				}
			printf("%d\n",dp[a][0]);
		}
	}
	return 0;
}
2022/7/9 23:13
加载中...