1 条题解
-
0
📝 题目大意
有 个人,第 个人的上一代(父亲)是 (保证 )。求从第 个人追溯到第 个人一共经过了几代人。
💡 解题思路
-
题目分析:
- 约束 保证了这是一个以 为根、编号递增的有根树,且 必为祖先,不会出现环。
- 的范围在 AtCoder ABC 的 B 题中通常为 或 ,直接模拟即可。
-
算法推导:
- 以 作为父指针,将每个人的父亲存入数组
p[i](p[1]无父亲,无需使用)。 - 从 出发,不断令
current = p[current],即沿着父亲链向上追溯,直到到达 。 - 每向上走一步,代际计数
steps加 ,最终steps即为答案。
- 以 作为父指针,将每个人的父亲存入数组
-
边界与细节:
- 输入 到 ,共 个数,注意下标从 开始。
- 当 时不会出现(题目隐含 ),但即使出现,循环不会执行,
steps为 。 - 保证 意味着编号严格递增,不会出现 的自环,也不会出现死循环。
⏱️ 复杂度分析
- 时间复杂度:,最坏情况下链长为 ,每条边访问一次。
- 空间复杂度:,用于存储父指针数组。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; int main() { int n; cin >> n; vector<int> p(n + 1); // p[i] 表示第 i 个人的父亲 // 读入 p_2 到 p_n for (int i = 2; i <= n; i++) { cin >> p[i]; } int current = n; // 从第 n 个人开始追溯 int steps = 0; // 记录经过的代数 // 沿着父亲链向上走,直到到达第 1 个人 while (current != 1) { current = p[current]; // 跳到父亲 steps++; // 代数 +1 } cout << steps << endl; return 0; } -
- 1
信息
- ID
- 876
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者