蒟蒻样例没过求调(倍增)
查看原帖
蒟蒻样例没过求调(倍增)
683859
complete_binary_tree楼主2023/7/10 22:12

rt

在样例中输出第2 3行会爆0(输出:4 0 0 4 4)

初步判断为lca()问题,但是找不到

求大佬帮调

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+5;
struct node{
	int to,nxt;
} e[N];
int head[N], cnt;
int deep[N], fa[N][19], lg[N];
void add(int u, int v){
	e[++cnt].nxt = head[u];
	head[u] = cnt;
	e[cnt].to = v;
}
//void lgg(int n){ for(int i = 1; i <= n; ++i) lg[i] = lg[i - 1] + (1 << log[i-1] == i);}
void dfs(int now, int fath){
	deep[now] = deep[fath] + 1;
	fa[now][0] = fath;
	for(int i = 1; i <= 19; ++i) fa[now][i] = fa[fa[now][i - 1]][i - 1];
	for(int i = head[now]; i; i = e[i].nxt) if(e[i].to != fath) dfs(e[i].to, now);
}
int lca(int a, int b){
	if(deep[a] < deep[b]) swap(a, b);
	int i = deep[a] - deep[b], j = 0;
	//printf("%d %d\n", deep[a], deep[b]);
	while(i){
		if(i & 1) a = fa[a][j];
		++j, i >>= 1;
	}
	//printf("%d %d %d %d\n", a, b, deep[a], deep[b]);
	if(a == b) return a;
	i = 19;
	while(i-- && a != b) if(fa[a][i] != fa[b][i]) a = fa[a][i], b = fa[b][i];
	return fa[a][0];
}
int n, m, u, v, s;
int main(){
	scanf("%d %d %d", &n, &m, &s);
	for(int i = 1; i <= n - 1; ++i) scanf("%d %d", &u, &v), add(u, v), add(v, u);
	dfs(s, 0);
	for(int i = 1; i <= m; ++i) scanf("%d %d", &u, &v), printf("%d\n", lca(u, v));
	return 0;
}

2023/7/10 22:12
加载中...