样例过,全Wa,求调
查看原帖
样例过,全Wa,求调
361592
histcat楼主2024/9/25 23:12

record

#include<bits/stdc++.h>
const int N = 1e5 + 10;
int n, q;
int head[N], nxt[N << 1], to[N << 1];
int edge_cnt;
int anc[N][21];
int dep[N];
using namespace std;

void add_edge(int x, int y)
{
	nxt[++edge_cnt] = head[x];
	to[edge_cnt] = y;
	head[x] = edge_cnt;
}

void dfs(int u, int fa, int depth)
{
	dep[u] = depth;
	anc[u][0] = fa;
	for(int i = head[u];i != 0;i = nxt[i])
	{
		int t = to[i];
		if(t == fa) continue;
		dfs(t, u, depth + 1);
	}
}

void init()
{
	for(int k = 20;k >= 1;k--)
	{
		for(int i = 1;i <= n;i++)
		{
			anc[i][k] = anc[anc[i][k - 1]][k - 1];
		}
	}
}

int lca(int a, int b)
{
	if(dep[a] < dep[b]) swap(a, b);
	for(int k = 20;k >= 0;k--)
	{
		if(dep[anc[a][k]] >= dep[b]) a = anc[a][k];
	}
	if(a == b) return a;
	for(int k = 20;k >= 0;k--)
	{
		if(anc[a][k] != anc[b][k]) a = anc[a][k], b = anc[b][k];
	}
	return anc[a][0];
}

int dis(int x, int y)
{
	int lcaa = lca(x, y);
	return abs(dep[lcaa] - dep[x]) + abs(dep[lcaa] - dep[y]);
}


int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin >> n >> q;
	int u, v;
	for(int i = 1;i <= n - 1;i++)
	{
		cin >> u >> v;
		add_edge(u, v), add_edge(v, u);
	}
	
	dfs(1, 0, 1);
	int a, b, c, d;
	init();
	
	while(q --)
	{
		cin >> a >> b >> c >> d;
		int x = lca(a, b), y = lca(c, d);
		if(dis(a, y) + dis(b, y) == dis(a, b) || dis(c, x) + dis(d, x) == dis(c, d))
			cout<<"Y\n";
		else cout << "N\n";
	}
	
//	cout << check(5, 8, 1);
	return 0;
}
2024/9/25 23:12
加载中...