mirror of
https://git.sb/baoshuo/OI-codes.git
synced 2024-11-10 02:38:49 +00:00
P3398 仓鼠找sugar
R52192514
This commit is contained in:
parent
2a50080840
commit
8b5aa6311c
69
Luogu/problem/P3398/P3398.cpp
Normal file
69
Luogu/problem/P3398/P3398.cpp
Normal file
@ -0,0 +1,69 @@
|
||||
#include <bits/stdc++.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int head[100005], ver[200005], nex[200005], tot;
|
||||
int fa[100005][30], dep[100005];
|
||||
|
||||
inline void addedge(int u, int v) {
|
||||
ver[tot] = v;
|
||||
nex[tot] = head[u];
|
||||
head[u] = tot++;
|
||||
}
|
||||
|
||||
void dfs(int pre, int cur) {
|
||||
fa[cur][0] = pre;
|
||||
dep[cur] = dep[pre] + 1;
|
||||
for (int i = 1; i <= 25; i++) {
|
||||
fa[cur][i] = fa[fa[cur][i - 1]][i - 1];
|
||||
}
|
||||
for (int i = head[cur]; i != -1; i = nex[i]) {
|
||||
if (!dep[ver[i]]) {
|
||||
dfs(cur, ver[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int lca(int u, int v) {
|
||||
if (dep[u] > dep[v]) {
|
||||
swap(u, v);
|
||||
}
|
||||
for (int i = 25; i > -1; i--) {
|
||||
if (dep[fa[v][i]] >= dep[u]) {
|
||||
v = fa[v][i];
|
||||
}
|
||||
}
|
||||
if (u == v) {
|
||||
return v;
|
||||
}
|
||||
for (int i = 25; i > -1; i--) {
|
||||
if (fa[u][i] != fa[v][i]) {
|
||||
u = fa[u][i];
|
||||
v = fa[v][i];
|
||||
}
|
||||
}
|
||||
return fa[u][0];
|
||||
}
|
||||
|
||||
int main() {
|
||||
int n, t, x, y, a, b, c, d;
|
||||
cin >> n >> t;
|
||||
memset(head, -1, sizeof(head));
|
||||
for (int i = 1; i < n; i++) {
|
||||
cin >> x >> y;
|
||||
addedge(x, y);
|
||||
addedge(y, x);
|
||||
}
|
||||
dfs(0, 1);
|
||||
while (t--) {
|
||||
cin >> a >> b >> c >> d;
|
||||
int x = lca(a, b), y = lca(c, d);
|
||||
if (dep[x] > dep[y]) {
|
||||
swap(x, y);
|
||||
swap(a, c);
|
||||
swap(b, d);
|
||||
}
|
||||
cout << (lca(x, y) == x && (lca(a, y) == y || lca(b, y) == y) ? "Y" : "N") << endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user