#P10431. [JOIST 2024] 三色灯 / Tricolor Lights

    ID: 14399 远端评测题 2000ms 1024MiB 尝试: 0 已通过: 0 难度: 7 上传者: 标签>2024交互题Special Judge通信题JOISC/JOIST(日本)

[JOIST 2024] 三色灯 / Tricolor Lights

题目背景

在本题中,你需要将两个文件合并成一个文件提交。不要引入任何头文件

题目描述

在一场游戏中,擅长博弈的 Anna 和 Bruno 将与发牌人 Dealer D-taro 对战。游戏进行时,Anna 和 Bruno 被隔离在不同的房间内,只能通过 Dealer D-taro 进行交流。

在这场游戏中,他们使用一行共 NN 盏灯。这些灯自左向右编号为 11NN,每盏灯都可以被点亮为三种颜色之一:红、绿或蓝。

在游戏开始时,Anna 将每盏灯点亮为红、绿或蓝中的一种。同时,Dealer D-taro 为每盏灯指定一种禁用颜色,用一个长度为 NN 的字符串 SS 表示。令 SiS_i 表示 SS 的第 ii 个字符(1iN1 \le i \le N)。若 SiS_i 为 ‘R’,则第 ii 盏灯的禁用颜色为红;若为 ‘G’,则禁用颜色为绿;若为 ‘B’,则禁用颜色为蓝。Anna 不能把第 ii 盏灯点亮成其禁用颜色。例如,若 SiS_i 为 ‘R’,则 Anna 不能把第 ii 盏灯点成红色。Dealer D-taro 会把每盏灯的禁用颜色信息告知 Anna,但不会告知 Bruno。

在点亮完每盏灯后,Anna 选择一个整数 ll,满足 1lmin(N,130)1 \le l \le \min(N, 130),并告知 Dealer D-taro。随后 Dealer D-taro 会把灯的总数 NN 以及 Anna 选择的整数 ll 告知 Bruno。接下来,他们按如下方式进行 QQ 轮:

  1. Dealer D-taro 选择一个整数 aja_j,介于 11Nl+1N - l + 1 之间,并把第 aj,aj+1,,aj+l1a_j, a_j+1, \ldots, a_j+l-1 盏灯被点亮的颜色序列展示给 Bruno。
  2. Bruno 根据所见的颜色序列,向 Dealer D-taro 回复一个整数。若该整数等于 aja_j,则 Anna 和 Bruno 赢得本轮。

然而,Dealer D-taro 可以根据 Anna 点亮灯的方式以及所选整数 ll 来改变对 a1,a2,,aQa_1, a_2, \ldots, a_Q 的选择。

你的任务是实现一个程序,使得 Anna 和 Bruno 能在所有 QQ 轮中获胜。

实现细节

你需要提交 22 个文件。

第一个文件为 Anna.cpp,用于实现 Anna 的策略。它应实现以下函数,并通过预处理指令 #include 包含 Anna.h

  • std::pair<std::string, int> anna(int N, std::string S)
    该函数在开始时被调用一次。
    • 参数 NN 为灯的数量。
    • 参数 SS 为长度为 NN 的字符串,表示 Dealer D-taro 指定的禁用颜色。
    • 返回值为一对:字符串 tt 表示 Anna 为每盏灯点亮的颜色,以及整数 ll 表示 Anna 选择的整数。令 tit_i 表示 tt 的第 ii 个字符(1iN1 \le i \le N)。tit_i 表示 Anna 将第 ii 盏灯点亮为颜色 tit_i。若 tit_i 为 ‘R’,则该灯被点为红;若为 ‘G’,则为绿;若为 ‘B’,则为蓝。
    • 字符串 tt 的长度必须为 NN,否则判定为 Wrong Answer [1]
    • 字符串 tt 的每个字符必须为 ‘R’、‘G’ 或 ‘B’,否则判定为 Wrong Answer [2]
    • 每个 tit_i 必须与 SS 中对应字符不同,否则判定为 Wrong Answer [3]
    • ll 必须满足 1lmin(N,130)1 \le l \le \min(N, 130),否则判定为 Wrong Answer [4]

第二个文件为 Bruno.cpp,用于实现 Bruno 的策略。它应实现以下函数,并通过预处理指令 #include 包含 Bruno.h

  • void init(int N, int l)
    该函数在开始时被调用一次。
    • 参数 NN 为灯的数量。
    • 参数 ll 为 Anna 选择的整数。
  • int bruno(std::string u)
    在调用 init 之后,该函数会被调用 QQ 次,对应游戏中每一轮的步骤 1122
    • 参数 uu 为长度为 ll 的字符串,由 ‘R’、‘G’、‘B’ 组成,表示第 aj,aj+1,,aj+l1a_j, a_j+1, \ldots, a_j+l-1 盏灯被点亮的颜色序列。
    • uku_k 表示 uu 的第 kk 个字符(1kl1 \le k \le l)。若 uku_k 为 ‘R’,则第 aj+k1a_j+k-1 盏灯被点为红;若为 ‘G’,则为绿;若为 ‘B’,则为蓝。
    • 返回值为 Bruno 回复的整数。
    • 返回值必须等于 aja_j,否则判定为 Wrong Answer [5]

重要注意事项

  • 你的程序可以实现其他供内部使用的函数,或使用全局变量。提交的文件将与评测器一同编译,合成为一个可执行文件。所有全局变量与内部函数都应声明在匿名命名空间中,以避免与其他文件冲突。实际评测时,Anna 进程与 Bruno 进程会分别运行,两个进程不能共享全局变量。
  • 你的程序不得使用标准输入与标准输出。你的程序不得通过任何方式与其他文件通信。但你可以向标准错误输出调试信息。

编译与试运行

你可以从竞赛网页下载包含样例评测器的归档文件,用于本地测试你的程序。

样例评测器文件为 grader.cpp。为进行测试,请将 grader.cppAnna.cppBruno.cppAnna.hBruno.h 置于同一目录,并运行如下命令进行编译。或者,你也可以运行归档文件中的 compile.sh

g++ -std=gnu++20 -O2 -o grader grader.cpp Anna.cpp Bruno.cpp

编译成功后,会生成名为 grader 的可执行文件。

请注意,实际评测器不同于样例评测器。样例评测器以单进程方式运行,从标准输入读取输入数据,并向标准输出与标准错误输出写出结果。

评分相关

实际评测程序会根据 Anna 点灯的方式以及所选整数 ll 来决定 a1,a2,,aQa_1, a_2, \ldots, a_Q。但 Bruno 的回答并不会影响 a1,a2,,aQa_1, a_2, \ldots, a_Q 的选择。

输入格式

样例评测器从标准输入读取如下数据。

NN
SS
QQ
a1a_1 a2a_2 \cdots aQa_Q

与实际评测不同的是,样例评测器必须有固定答案。aja_j1jQ1 \le j \le Q)表示第 jj 轮中 Dealer D-taro 选择的整数。在你的程序中,对于 Anna 选择的整数 ll,必须满足 1ajNl+11 \le a_j \le N - l + 1

输出格式

样例评测器会向标准输出与标准错误输出如下输出(引号仅为说明):

  • 若答案正确,输出 “Accepted: l\texttt{Accepted: l}”,其中 ll 为 Anna 选择的整数。
  • 若答案错误,则输出出错类型,例如 “Wrong Answer [1]”。

如果你的程序同时满足多类 Wrong Answer 的条件,样例评测器只会报告其中一种。

8
RGGBRBBG
2
3 1

提示

约束条件

  • 1N5000001 \le N \le 500\,000
  • 1Q100001 \le Q \le 10\,000
  • SS 为长度为 NN 的字符串,仅由 ‘R’、‘G’、‘B’ 组成。
  • NNQQ 为整数。

子任务

1.(5 分)N131N \le 131
2.(5 分)N250N \le 250
3.(5 分)N380N \le 380
4.(15 分)N7000N \le 7\,000
5.(70 分)无额外限制。在该子任务中,得分规则如下:

  • ll^* 表示该子任务所有测试用例中 Anna 选择的 ll 的最大值。
  • 若该子任务中任意一个测试用例被判定为 Wrong Answer [1][5](见实现细节),或超时、超内存、发生运行时错误,则本子任务得分为 00 分。
  • 若该子任务所有测试用例均正确,则得分如下所示:
the value of ll^* score
61<l13061 < l^* \le 130 10 points
41<l6141 < l^* \le 61 20 points
34<l4134 < l^* \le 41 25 + 3 x (41l)(41 - l^*) points
28<l3428 < l^* \le 34 46 + 4 x (34l)(34 - l^*) points
l28l^* \le 28 70 points

通信示例

下面给出样例评测器的一个输入,以及相应的函数调用过程。

样例函数调用

Sample Input 1 调用 返回值
$\texttt{8}\\\texttt{RGGBRBBG}\\\texttt{2}\\\texttt{3 1}$ anna(8, "RGGBRBBG") ("BBRGBGRR", 5)
^ init(8, 5)
bruno("RGBGR") 3
bruno("BBRGB") 1

在该示例中,Anna 接收到灯的数量 N=8N = 8 与禁用颜色字符串 S="RGGBRBBC"S = \text{"RGGBRBBC"}。Anna 选择用字符串 t="BBRGBGRR"t = \text{"BBRGBGRR"} 点亮每盏灯,并选择整数 l=5l = 5,并将其告知 Dealer D-taro。随后,Dealer D-taro 将 N=8N = 8l=5l = 5 告知 Bruno。

在第一轮中,Dealer D-taro 选择 a1=3a_1 = 3。Bruno 收到表示第 3,4,5,6,73,4,5,6,7 盏灯颜色的字符串 u="RGBGR"u = \text{"RGBGR"},并回复整数 33,与 a1a_1 相同。输入样例 11 满足所有子任务的全部约束。可从竞赛网站下载的文件 sample-01-in.txt 与输入样例 11 相对应。