爆零求助
查看原帖
爆零求助
232838
huangkx楼主2021/6/5 07:56

样例过了,但是爆零······
写的倍增LCA。
求大佬帮助!

#include <bits/stdc++.h>
using namespace std;
int n, q;
vector <int> tree[100005];
int dep[100005];
int fa[100005][32];
int x, y, r, k;
int a, b, c, d;
void get_value(int u, int father)
{
	dep[u] = dep[father] + 1;
	fa[u][0] = father;
	for(int i=1; i<=31; i++)
		fa[u][i] = fa[fa[u][i-1]][i-1];
	for(int i=0; i<tree[u].size(); i++){
		int v = tree[u][i];
		if(v == father) continue;
		get_value(v, u);
	}
}
int lca(int u, int v)
{
	if(dep[u] < dep[v]) swap(u, v);
	for(int i=31; i>=0; i--){
		if(dep[fa[u][i]] >= dep[v]) u = fa[u][i];
		if(u == v) return u;
	}
	for(int i=31; i>=0; i--){
		if(fa[u][i] != fa[v][i]){
			u = fa[u][i];
			v = fa[v][i];
		}
	}
	return fa[u][0];
}
int main()
{
	scanf("%d %d", &n, &q);
	for(int i=1; i<=n-1; i++){
		scanf("%d %d", &x, &y);
		tree[x].push_back(y);
		fa[y][0] = x;
	}
	for(int i=1; i<=n; i++){
		if(fa[i][0] == 0){
			r = i;
			break;
		}
	}
	get_value(r, 0);
	for(int i=1; i<=q; i++){
		scanf("%d %d %d %d", &a, &b, &c, &d);
		x = dep[lca(a, b)];
		y = dep[lca(c, d)];
		k = max(max(dep[lca(a, c)], dep[lca(a, d)]), max(dep[lca(b, c)], dep[lca(b, d)]));
		if(k >= max(x, y)) printf("Y\n");
		else printf("N\n");
	}
	return 0;
}
2021/6/5 07:56
加载中...