1 条题解

  • 0
    @ 2026-3-16 10:45:18

    文字教学

    这道题的核心是预处理每个员工的所有管理者,然后对每个查询找管理者集合的交集并取最大编号:

    1. 管理者定义:员工x的管理者是x自己、直接领导、间接领导(即x的整个祖先链)。
    2. 预处理:用二维数组 ok[y][x] 表示“y能管理x”。对每个x,从x开始向上遍历所有祖先,标记 ok[y][x] = true
    3. 查询处理:对每个查询的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
    上传者