P11300 [NOISG 2021 Finals] Archaeologist

题目背景

### 滥用本题评测将被封号。 一组考古学家正在探索一个由房间和双向通道组成的遗迹。遗迹中的房间编号为 $0$ 到 $N-1$,且满足以下条件: 1. 遗迹中不存在环。 2. 所有房间均可从入口房间(编号为 $0$)到达。 考古学家无法回头(即不能沿已走过的通道返回),也无法得知其他考古学家的数量或位置。然而,他们可以通过调整房间的光照等级来标记房间的状态。每个房间的光照等级初始为 $0$,可以被设置为 $0$ 到 $L$ 之间的任意值。 任务是设计一种策略,使得所有房间均能被 $K$ 名考古学家探索到。

题目描述

为了完成本题,你需要在程序开头定义函数 `void set_light(int level)`,你无需引入其他头文件。 实现以下函数: ```cpp void archaeologist(int N, int K, int L, vector map, int lightlevel, vector paths) ``` - `N`:房间总数。 - `K`:考古学家总数。 - `L`:光照等级的最大值。 - `map`:长度为 $N$ 的数组,其中 `map[0]` $= -1$,对于 $i \geq 1$,`map[i]` 表示房间 $i$ 直接连接的父房间编号。 - `lightlevel`:当前房间的光照等级。 - `paths`:当前房间中其他通道终点的光照等级列表(顺序随机,不包括返回的通道)。 ### 函数行为 1. 每次调用 `archaeologist` 表示一位考古学家从房间 $0$ 出发,依次探索多个房间,直到到达目标房间。 2. 考古学家可以调用以下辅助函数完成任务: - `void set_light(int level)`: - 设置当前房间的光照等级。 - 参数 `level` 为新的光照等级,需满足 $0 \leq$ `level` $\leq L$。 - `(int, int[]) take_path(int corridor)`: - 选择通道进入相邻房间。 - 参数 `corridor` 表示通道索引。 - 返回值包含两个数据: 1. 新房间的编号。 2. 新房间中其他通道终点的光照等级列表(顺序随机,不包括返回的通道)。 ### 注意事项 1. 每次调用 `archaeologist` 仅代表一位考古学家的行为,不能共享全局变量。 2. 程序不能通过调用 `exit()` 提前终止。

输入格式

- 第一行包含三个整数 $N, K, L$。 - 第二行包含 $N-1$ 个整数,表示 `map[i]` 的值($i \geq 1$)。

输出格式

程序通过调用辅助函数完成所有探索任务,无需额外输出。

说明/提示

【数据范围】 - $1 \leq N \leq 1000$ - $K$ 等于无其他出口的房间数量(死胡同房间)。 - $L$ 大于等于房间 $0$ 到最远房间的通道数。 | 子任务编号 | 分值 | 限制条件 | | :--------: | :--: | :------------------------------: | | $1$ | $6$ | $L = 1$,且 `map[i]` $= 0$ 对所有 $1 \leq i < N$ 成立 | | $2$ | $14$ | $L = N$ | | $3$ | $15$ | `map` 为完全二叉树 | | $4$ | $18$ | `map` 除 $-1$ 外所有元素都至少出现了两次 | | $5$ | $47$ | 无额外限制 |