LCA, 倍增, 过样例, 0pts, 求助
查看原帖
LCA, 倍增, 过样例, 0pts, 求助
362750
TernaryTree楼主2022/5/11 17:53
#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e6 + 1;
const int maxm = 1e6 + 1;
const int maxd = 20;

struct edge {
    int from, to, next;
};

int cnt;
int head[maxn];
edge e[maxm];

void addedge(int u, int v) {
    e[++cnt].to = v;
    e[cnt].from = u;
    e[cnt].next = head[u];
    head[u] = cnt;
}

int n, q;
int a, b, c, d;
int fa[maxn][maxd];
int dep[maxn];

void get_dep(int u, int depth) {
	dep[u] = depth;
	for (int i = head[u]; i; i = e[i].next) {
		get_dep(e[i].to, depth + 1);
	}
} 

void get_fa(int cur, int fat) {
	fa[cur][0] = fat;
	for (int i = 1; i <= log2(dep[cur]) + 1; i++) {
		fa[cur][i] = fa[fa[cur][i - 1]][i - 1];
	}
	for (int i = head[cur]; i; i = e[i].next) {
		get_fa(e[i].to, cur);
	}
}

int lca(int u, int v) {
	if (dep[u] < dep[v]) swap(u, v);
	while (dep[u] > dep[v]) {
		u = fa[u][(int) log2(dep[u] - dep[v])];
	}
	if (u == v) return u;
	for (int i = log2(dep[u]); i >= 0; i--) {
		if (fa[u][i] != fa[v][i]) {
			u = fa[u][i];
			v = fa[v][i];
		}
	}
	return fa[u][0];
}

int main() {
	cin >> n >> q;
	int u, v;
	for (int i = 1; i <= n - 1; i++) {
		cin >> u >> v;
		addedge(u, v);
	}
	get_dep(1, 0);
	get_fa(1, 0);
	for (int i = 1; i <= q; i++) {
		cin >> a >> b >> c >> d;
		int abr = lca(a, b);
		int cdr = lca(c, d);
		bool flag = false;
		if (abr == cdr) flag = true;
		else {
			if (dep[abr] > dep[cdr]) {
				swap(abr, cdr);
				swap(a, c);
				swap(b, d);
			}
			flag = (lca(a, cdr) == cdr && lca(cdr, b) == cdr);
		}
		if (flag) {
			cout << "Y" << endl;
		} else {
			cout << "N" << endl;
		}
	}
	return 0;
}
2022/5/11 17:53
加载中...