#L4017. 「CEOI2023」A Light Inconvenience

「CEOI2023」A Light Inconvenience

题目描述

译自 CEOICEOI 20232023 Day1Day1 T1T1AA LightLight InconvenienceInconvenience」。

背景

表演中演员站成一行,从左到右编号为 1,2,1, 2, \ldots,人数随时间变化。每位演员手持火炬,火炬状态为「点燃」或「熄灭」。初始时,仅最左侧 11 位演员的火炬是点燃的。

表演分为 QQ 幕,每幕开始时会发生以下两种事件之一:

  1. 右侧加入 pa>0p_a > 0 位演员(新加入演员的火炬均为熄灭状态);
  2. 最右侧 pa>0p_a > 0 位演员离开(离开的演员若火炬点燃,会自动熄灭)。

事件发生后,委员会需执行以下操作:

  1. 宣布一个非负整数 tat_a,满足 ta5pat_a \leq 5p_a,且需尽可能小(评分与 ta/pat_a/p_a 比值相关);
  2. 火炬传递:点燃的演员会将火传给右侧 tat_a 位演员。具体来说,演员 ii 的火炬被点燃,当且仅当传递前 max{ita,1},,i\max\{i-t_a, 1\}, \ldots, i 中至少有一位演员的火炬是点燃的;
  3. 熄灭控制:宣布需保持点燃的演员列表,需满足:
    • 列表按严格递增顺序排列;
    • 最右侧演员的火炬必须保持点燃;
    • 剩余点燃的火炬数不超过 150150

核心任务

实现指定交互函数,在满足所有限制的前提下,完成每幕的 tat_a 选择和点燃列表指定。

交互过程

本题为交互题,需实现以下三个函数(源代码必须包含文件 light.h):

  1. void prepare():程序开头调用,用于初始化(可空实现);
  2. std::pair<long long, std::vector<long long>> join(long long p_a)
    • 触发条件:右侧加入 pap_a 位演员;
    • 返回值:(t_a, 保持点燃的演员列表),列表需严格递增;
  3. std::pair<long long, std::vector<long long>> leave(long long p_a)
    • 触发条件:最右侧离开 pap_a 位演员;
    • 返回值:(t_a, 保持点燃的演员列表),列表需严格递增。

交互限制

  • 禁止读写标准输入/输出(仅可向标准错误流 stderr 输出调试信息);
  • 任何返回值违反限制(如 ta>5pat_a > 5p_a、列表非递增、列表包含无效编号等),程序会立即终止并判为「Not correct」。

限制与评分

数据范围

  • 任意时刻演员人数最大值 N1017N \leq 10^{17}
  • 幕数 1Q500001 \leq Q \leq 50000

子任务评分

子任务编号 附加限制 分值
11 仅一次 leave 调用 55
22 N700N \leq 700 -
33 N5000N \leq 5000 1010
44 N25000N \leq 25000 55
55 N105N \leq 10^5 1010
66 N5×105N \leq 5 \times 10^5 55
77 无附加限制 6060

子任务 77 评分细则(按 max(ta/pa)\max(t_a/p_a) 比值)

max(ta/pa)\max(t_a/p_a) 区间 [0,1][0,1] (1,2](1,2] (2,3](2,3] (3,5](3,5]
分值 6060 3535 2020 1010

注:满分要求所有幕的 tapat_a \leq p_a

样例交互

交互流程(Q=4Q=4

调用 返回值 解释
prepare() - 初始化(无操作)
初始状态 仅演员 11 的火炬点燃
join(3) (3,{2,4})(3, \{2, 4\}) 加入 33 位演员(总人数 44):
1. ta=3t_a=3,演员 11 点燃 2,3,42,3,4
2. 保持点燃 2,42,4(熄灭 1,31,3
leave(2) (0,{2})(0, \{2\}) 离开 22 位演员(总人数 22):
1. ta=0t_a=0,无新点燃;
2. 保持点燃 22(最右侧)
join(2) (3,{2,4})(3, \{2, 4\}) 加入 22 位演员(总人数 44):
1. ta=3t_a=3,演员 22 点燃 3,43,4
2. 保持点燃 2,42,4(熄灭 33
join(3) (3,{2,4,7})(3, \{2, 4, 7\}) 加入 33 位演员(总人数 77):
1. ta=3t_a=3,演员 2,42,4 点燃 3,5,6,73,5,6,7
2. 保持点燃 2,4,72,4,7(熄灭 3,5,63,5,6

交互器说明

样例交互器(sample_grader.cpp

  1. 从标准输入读取 QQ
  2. 调用 prepare()
  3. 对每幕:
    • 读取输入:正数表示 join(p_a),负数表示 leave(-p_a)
    • 调用对应函数并验证返回值;
  4. 向标准输出输出交互结果(如 CorrectInvalid return value 等)。

实际交互器

仅输出以下结果之一:

  • Not correct:违反任何限制;
  • Security violation!:读写标准输入/输出;
  • Partially correct:部分子任务通过;
  • Correct:全部限制满足。