From 143cede06ff28c7ef9ea1c045fcd0dd86d8d49f5 Mon Sep 17 00:00:00 2001 From: hanyixuanten Date: Thu, 29 Oct 2026 05:32:11 +0000 Subject: [PATCH] new file: P3398.cpp --- P3398.cpp | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ P3398.md | 60 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 P3398.cpp create mode 100644 P3398.md diff --git a/P3398.cpp b/P3398.cpp new file mode 100644 index 0000000..3eb9012 --- /dev/null +++ b/P3398.cpp @@ -0,0 +1,73 @@ +#include +using namespace std; +int n, q; +vector fri[100005]; +int fa[100005]; +int dep[100005]; +int top[100005]; +int son[100005]; +int cnt[100005]; +void dfs1(int now, int from) { + cnt[now] = 1; + for(int i : fri[now]) { + if(i == from) continue; + fa[i] = now; + dep[i] = dep[now] + 1; + dfs1(i, now); + cnt[now] += cnt[i]; + if(cnt[son[now]] < cnt[i]) son[now] = i; + } +} +void dfs2(int now, int from) { + top[now] = from; + if(son[now]) dfs2(son[now], from); + for(int i : fri[now]) { + if(i == fa[now] || i == son[now]) continue; + dfs2(i, i); + } +} +int lca(int a, int b) { + while(top[a] != top[b]) { + if(dep[top[a]] < dep[top[b]]) swap(a, b); + a = fa[top[a]]; + } + if(dep[a] < dep[b]) swap(a, b); + return b; +} +int main() { + scanf("%d%d", &n, &q); + for(int i = 1, u, v; i < n; ++i) { + scanf("%d%d", &u, &v); + fri[u].push_back(v); + fri[v].push_back(u); + } + dfs1(1, 0); + dfs2(1, 1); + while(q--) { + int a, b, c, d; + scanf("%d%d%d%d", &a, &b, &c, &d); + int lca1 = lca(a, b); + int lca2 = lca(c, d); + // lca1 在 [c, d] 上或 lca2 在 [a, b] 上 + if(dep[lca2] >= dep[lca1]) { + if(lca(a, lca2) == lca2 || lca(b, lca2) == lca2) { + printf("Y\n"); + } else { + printf("N\n"); + } + } else { + if(lca(c, lca1) == lca1 || lca(d, lca1) == lca1) { + printf("Y\n"); + } else { + printf("N\n"); + } + } + } + return 0; +} +/* + - deep[x]>=deep[LCA(s,t)] + + - LCA(s,x)=x或LCA(t,x)=x; + +*/ \ No newline at end of file diff --git a/P3398.md b/P3398.md new file mode 100644 index 0000000..8b00534 --- /dev/null +++ b/P3398.md @@ -0,0 +1,60 @@ +# P3398 仓鼠找 sugar + +## 题目描述 + +小仓鼠的和他的基(mei)友(zi)sugar 住在地下洞穴中,每个节点的编号为 $1\sim n$。地下洞穴是一个树形结构。这一天小仓鼠打算从从他的卧室($a$)到餐厅($b$),而他的基友同时要从他的卧室($c$)到图书馆($d$)。他们都会走最短路径。现在小仓鼠希望知道,有没有可能在某个地方,可以碰到他的基友? + + +小仓鼠那么弱,还要天天被 zzq 大爷虐,请你快来救救他吧! + +## 输入格式 + +第一行两个正整数 $n$ 和 $q$,表示这棵树节点的个数和询问的个数。 + +接下来 $n-1$ 行,每行两个正整数 $u$ 和 $v$,表示节点 $u$ 到节点 $v$ 之间有一条边。 + +接下来 $q$ 行,每行四个正整数 $a$、$b$、$c$ 和 $d$,表示节点编号,也就是一次询问,其意义如上。 + +## 输出格式 + +对于每个询问,如果有公共点,输出大写字母 `Y`;否则输出`N`。 + +## 输入输出样例 #1 + +### 输入 #1 + +``` +5 5 +2 5 +4 2 +1 3 +1 4 +5 1 5 1 +2 2 1 4 +4 1 3 4 +3 1 1 5 +3 5 1 4 +``` + +### 输出 #1 + +``` +Y +N +Y +Y +Y +``` + +## 说明/提示 + +**本题时限 1s,内存限制 128M,因新评测机速度较为接近 NOIP 评测机速度,请注意常数问题带来的影响。** + + +$20\%$ 的数据 $n, q\le200$。 + +$40\%$ 的数据 $n, q\le 2\times10^3$。 + +$70\%$ 的数据 $n, q\le 5\times10^4$。 + +$100\%$ 的数据 $1\le n, q\le10^5$。 \ No newline at end of file