1 条题解
-
0
文字教学
这道题的核心是预处理每个员工的所有管理者,然后对每个查询找管理者集合的交集并取最大编号:
- 管理者定义:员工x的管理者是x自己、直接领导、间接领导(即x的整个祖先链)。
- 预处理:用二维数组
ok[y][x]表示“y能管理x”。对每个x,从x开始向上遍历所有祖先,标记ok[y][x] = true。 - 查询处理:对每个查询的m个员工,从最大编号(N-1)往下遍历y,检查y是否能管理所有m个员工,第一个满足条件的y就是答案。
代码
#include <bits/stdc++.h> using namespace std; const int N = 305; int f[N]; bool ok[N][N]; int a[N]; int main() { int n; cin >> n; for (int i = 1; i <= n-1; ++i) { cin >> f[i]; } memset(ok, 0, sizeof(ok)); // 预处理每个员工的所有管理者 for (int x = 0; x < n; ++x) { int cur = x; while (true) { ok[cur][x] = true; if (cur == 0) break; cur = f[cur]; } } int Q; cin >> Q; while (Q--) { int m; cin >> m; for (int i = 0; i < m; ++i) { cin >> a[i]; } // 从大到小找满足条件的y int ans = -1; for (int y = n-1; y >= 0; --y) { bool flag = true; for (int i = 0; i < m; ++i) { if (!ok[y][a[i]]) { flag = false; break; } } if (flag) { ans = y; break; } } cout << ans << endl; } return 0; }
- 1
信息
- ID
- 9438
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 3
- 标签
- 递交数
- 3
- 已通过
- 3
- 上传者
京公网安备 11011102002149号