样例过,0pts,求调!
查看原帖
样例过,0pts,求调!
878013
_Supernova楼主2023/12/12 23:01
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5, max2 = 20;
int n, q, u, v, a, b, c, d, dep[maxn], f[maxn][max2];
vector <int> e[maxn];
void dfs(int x, int fa) {
	for (int i = 0; i < e[x].size(); ++i) {
		int to = e[x][i];
		if (to == fa) {
			continue;
		}
		dep[to] = dep[x] + 1;
		f[to][0] = x;
		dfs(to, x);
	}
	return ;
}
int lca(int x, int y) {
	if (dep[x] > dep[y]) {
		swap(x, y);
	}
	for (int i = 0; i < max2; ++i) {
		if (((dep[y] - dep[x]) >> i) & 1) {
			y = f[y][i];
		}
		if (dep[x] == dep[y]) {
			break;
		}
	}
	if (x == y) {
		return x;
	}
	for (int i = max2 - 1; i >= 0; --i) {
		if (f[x][i] == f[y][i]) {
			continue;
		}
		x = f[x][i];
		y = f[y][i];
	}
	return f[x][0];
}
bool judge(int x, int y, int k, int l, int L1, int L2) {
	int dis_x_L1, dis_L1_l, dis_x_l, dis_k_L2, dis_L2_y, dis_k_y;
	dis_x_L1 = abs(dep[x] - dep[L1]);
	dis_L1_l = abs(dep[L1] + dep[l] - 2 * dep[L2]);
	dis_x_l = abs(dep[x] + dep[l] - 2 * dep[L2]);
	dis_k_L2 = abs(dep[k] - dep[L2]);
	dis_L2_y = abs(dep[L2] + dep[y] - 2 * dep[L1]);
	dis_k_y = abs(dep[k] + dep[y] - 2 * dep[L1]);
	if (x == y) {
		int dis_k_x = abs(dep[k] - dep[x]);
		int dis_x_l = abs(dep[x] + dep[l] - 2 * dep[L2]);
		int dis_k_l = abs(dep[k] + dep[l] - 2 * dep[L2]);
		if (dis_k_x + dis_x_l == dis_k_l) {
			return true;
		}
		return false;
	}
	if (k == l) {
		int dis_x_k = abs(dep[x] - dep[k]);
		int dis_k_y = abs(dep[k] + dep[y] - 2 * dep[L1]);
		int dis_x_y = abs(dep[x] + dep[y] - 2 * dep[L1]);
		if (dis_x_k + dis_k_y == dis_x_y) {
			return true;
		}
		return false;
	}
	if (dis_x_L1 + dis_L1_l == dis_x_l) {
		return true;
	}
	if (dis_k_L2 + dis_L2_y == dis_k_y) {
		return true;
	} 
	return false;
}
int main(void) {
	scanf("%d %d", &n, &q);
	for (int i = 1; i < n; ++i) {
		scanf("%d %d", &u, &v);
		e[u].push_back(v);
		e[v].push_back(u);
	}
	f[1][0] = -1;
	dfs(1, 0);
	for (int j = 1; j < max2; ++j) {
		for (int i = 1; i <= n; ++i) {
			f[i][j] = f[f[i][j - 1]][j - 1];
		}
	}
	while (q--) {
		scanf("%d %d %d %d", &a, &b, &c, &d);
		int lca1, lca2;
		lca1 = lca(a, b);
		lca2 = lca(c, d);
		if (judge(a, b, c, d, lca1, lca2)) {
			printf("Y\n");
		}
		else {
			printf("N\n");
		} 
	}
    return 0;
}
2023/12/12 23:01
加载中...