#L3985. 「JOI Open 2023」古代机器 2

「JOI Open 2023」古代机器 2

当前没有测试数据。

题目描述

译自 JOI Open 2023 T1 「古代の機械 2 / Ancient Machine 2」

Bitaro 和 Bibako 是挖掘和调查 JOI 王国废墟的考古学家。在废墟中,Bitaro 发现了一块古老的石板,Bibako 发现了一台古老的机器。

从研究结果中,Bitaro 发现石板上写有一个长为 NN 的字符串 SS。字符串中每个字符要么是 00,要么是 11。然而,他还不知道字符串 SS 中的每个字符是什么。

另一方面,从研究结果中,Bibako 弄清了如何使用机器。为了使用它,需要将石板放在机器上,输入一个整数 mm 和两个整数序列 a,ba,b,然后做一次查询。这里整数 mm 和整数序列 a,ba,b 需满足如下条件:

  1. 整数 mm1110021002 之间(包括两端)。
  2. 序列 aabb 的长度均为 mm
  3. 序列 a,ba,b 中的元素都是 00m1m-1 之间的整数(包括两端)。

如果把石板放在机器上,输入整数 mm 和两个整数序列 a,ba,b 并做一次查询,机器会按如下方式操作并显示一个整数:

  1. 机器对其内存区域置 00
  2. 机器进行如下的 NN 次操作。第 i+1i+1 次(0iN10\le i\le N-1)操作按如下方式进行:
    • xx 表示机器内存区域中当前的整数。机器读取字符 SiS_iSiS_i 是字符串 SS 中的第 ii 个字符,下标从 00 开始)。
    • 如果 SiS_i00,机器会将内存区域置为 axa_xaxa_x 是序列 aa 中第 xx 个元素,下标从 00 开始)。
    • 如果 SiS_i11,机器会将内存区域置为 bxb_xbxb_x 是序列 bb 中第 xx 个元素,下标从 00 开始)。
  3. 机器将展示内存区域中最终置为的整数。

使用这个机器,Bitaro 想要确定石板上写的字符串。但机器十分脆弱,查询次数不能超过 10001000 次,且输入机器的整数 mm 的最大值需要越小越好。

实现细节

你需要在程序一开始使用预处理指令 #include 引入库 ancient2.h,它应实现如下函数:

  • std::string Solve(int N):每组测试数据中仅被调用一次,需返回与石板上字符串 SS 相同的字符串。
    • 参数 NN:表示石板上字符串 SS 的长度 NN
    • 返回要求:
      1. 长度必须为 NN,否则被判为 Wrong Answer [1]。
      2. 每个字符只能是 0011,否则被判为 Wrong Answer [2]。
      3. 必须与 SS 完全相同,否则被判为 Wrong Answer [3]。

你的程序可以调用如下函数:

  • int Query(int m, std::vector<int> a, std::vector<int> b):用于发起一次查询。
    • 参数说明:
      1. mm:输入机器的整数 mm,需在 1110021002 之间(包括两端),否则被判为 Wrong Answer [4]。
      2. a,ba,b:输入机器的两个整数序列,长度均需等于 mm,否则被判为 Wrong Answer [5]。
      3. a,ba,b 中元素需在 00m1m-1 之间(包括两端),否则被判为 Wrong Answer [6]。
    • 返回值:机器最终显示的整数。
    • 调用限制:次数不能超过 10001000 次,否则被判为 Wrong Answer [7]。

注意事项

  1. 程序可实现其他内部函数或使用全局变量。
  2. 禁止使用标准输入输出,禁止与其他文件通信,但可将调试信息输出到标准错误输出。

编译和测试运行

可在「附加文件」下载样例 grader 测试程序,需将 grader.cppancient2.cppancient2.h 放在同一文件夹,编译命令如下(或运行 compile.sh):

g++ -std=gnu++17 -O2 -o grader grader.cpp ancient2.cpp

编译成功后生成可执行文件 grader

样例交互器输入

样例交互器从标准输入读取:

  1. 第一行:整数 NN
  2. 第二行:长为 NN 的字符串 SS

样例交互器输出

  1. 若正确:输出 Query 函数中参数 mm 的最大值,如 Accepted: 22;若未调用 Query 且正确,输出 Accepted: 0
  2. 若错误:输出错误类别,如 Wrong Answer [4];若满足多种错误类别,仅输出其中一种。

数据范围与提示

  1. 全部数据满足:N=1000N=1000SS 是长为 NN0101 字符串。
  2. 实际交互器非适应性,即答案在开始时已确定。
  3. 评分规则:
    • 若任意一组数据被判错误,本题得 00 分。
    • 若所有数据正确,分数由 MM(所有数据 Querymm 的最大值)确定:
      • 0M1020\le M\le 102,得 100100 分。
      • 103M1002103\le M\le 1002,得分为 10+(1002M)2900010+\lfloor \frac{(1002-M)^2}{9000}\rfloorx\lfloor x\rfloor 表示不超过 xx 的最大整数)。

样例交互

假设石板上字符串 SS110N=3N=3),样例函数调用如下:

对 Solve 的调用 返回值 对 Query 的调用 返回值
Solve(3) Query(4, [3,3,2,2], [2,2,1,0]) 33
Query(2, [0,1], [1,0]) 00
Query(1, [0], [0])
Query(3, [1,1,1], [1,1,1]) 11
110

样例 Query 过程(以 Query(4, [3,3,2,2], [2,2,1,0]) 为例)

  1. 机器初始内存为 00
  2. 11 次操作(i=0i=0S0=1S_0=1):内存置为 b0=2b_0=2
  3. 22 次操作(i=1i=1S1=1S_1=1):内存置为 b2=1b_2=1
  4. 33 次操作(i=2i=2S2=0S_2=0):内存置为 a1=3a_1=3
  5. 最终内存为 33,故返回 33

注:该样例输入不满足 N=1000N=1000,满足限制的样例见文件 sample-02.txt