#P11300. [NOISG 2021 Finals] Archaeologist

    ID: 14426 远端评测题 12000ms 1024MiB 尝试: 0 已通过: 0 难度: (无) 上传者: 标签>2021交互题Special JudgeNOISG(新加坡)

[NOISG 2021 Finals] Archaeologist

题目背景

滥用本题评测将被封号。

一组考古学家正在探索一个由房间和双向通道组成的遗迹。遗迹中的房间编号为 00N1N-1,且满足以下条件:

  1. 遗迹中不存在环。
  2. 所有房间均可从入口房间(编号为 00)到达。

考古学家无法回头(即不能沿已走过的通道返回),也无法得知其他考古学家的数量或位置。然而,他们可以通过调整房间的光照等级来标记房间的状态。每个房间的光照等级初始为 00,可以被设置为 00LL 之间的任意值。

任务是设计一种策略,使得所有房间均能被 KK 名考古学家探索到。

题目描述

为了完成本题,你需要在程序开头定义函数 void set_light(int level),你无需引入其他头文件。

实现以下函数:

void archaeologist(int N, int K, int L, vector<int> map, int lightlevel, vector<int> paths)
  • N:房间总数。
  • K:考古学家总数。
  • L:光照等级的最大值。
  • map:长度为 NN 的数组,其中 map[0] =1= -1,对于 i1i \geq 1map[i] 表示房间 ii 直接连接的父房间编号。
  • lightlevel:当前房间的光照等级。
  • paths:当前房间中其他通道终点的光照等级列表(顺序随机,不包括返回的通道)。

函数行为

  1. 每次调用 archaeologist 表示一位考古学家从房间 00 出发,依次探索多个房间,直到到达目标房间。
  2. 考古学家可以调用以下辅助函数完成任务:
    • void set_light(int level)
      • 设置当前房间的光照等级。
      • 参数 level 为新的光照等级,需满足 00 \leq level L\leq L
    • (int, int[]) take_path(int corridor)
      • 选择通道进入相邻房间。
      • 参数 corridor 表示通道索引。
      • 返回值包含两个数据:
        1. 新房间的编号。
        2. 新房间中其他通道终点的光照等级列表(顺序随机,不包括返回的通道)。

注意事项

  1. 每次调用 archaeologist 仅代表一位考古学家的行为,不能共享全局变量。
  2. 程序不能通过调用 exit() 提前终止。

输入格式

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

输出格式

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

7 4 2
0 0 1 1 2 2

提示

【数据范围】

  • 1N10001 \leq N \leq 1000
  • KK 等于无其他出口的房间数量(死胡同房间)。
  • LL 大于等于房间 00 到最远房间的通道数。
子任务编号 分值 限制条件
11 66 L=1L = 1,且 map[i] =0= 0 对所有 1i<N1 \leq i < N 成立
22 1414 L=NL = N
33 1515 map 为完全二叉树
44 1818 map1-1 外所有元素都至少出现了两次
55 4747 无额外限制