QOJ.ac

QOJ

时间限制: 2 s 内存限制: 1024 MB 总分: 100 交互

#6774. 古代机器 2

统计

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

根据研究结果,Bitaro 发现石板上写着一个长度为 $N$ 的字符串 $S$。字符串中的每个字符要么是 ‘0’,要么是 ‘1’。然而,他目前还不知道字符串 $S$ 的具体内容。

另一方面,根据研究结果,Bibako 发现了如何使用这台机器。要使用它,我们需要将石板放在机器上,输入一个整数 $m$ 和两个整数序列 $a, b$,然后进行一次查询。这里,整数 $m$ 和序列 $a, b$ 应满足以下条件:

  • 整数 $m$ 在 $1$ 到 $1\,002$ 之间(含 $1$ 和 $1\,002$)。
  • 序列 $a$ 和 $b$ 的长度均等于 $m$。
  • 序列 $a$ 和 $b$ 中的每个元素都是 $0$ 到 $m - 1$ 之间的整数(含 $0$ 和 $m - 1$)。

如果我们把石板放在机器上,输入整数 $m$ 和两个整数序列 $a, b$,并进行一次查询,机器将按以下方式运行并显示一个整数:

  1. 机器将内存区域设置为 $0$。
  2. 机器执行以下 $N$ 次操作。第 $(i + 1)$ 次操作($0 \le i \le N - 1$)按如下方式进行: 令 $x$ 为机器内存区域中当前设置的整数。机器读取字符 $S_i$。 这里,$S_i$ 是字符串 $S$ 的第 $i$ 个字符(从 $0$ 开始计数)。
    • 如果 $S_i$ 是 ‘0’,机器将内存区域设置为 $a_x$。 这里,$a_x$ 是序列 $a$ 的第 $x$ 个元素(从 $0$ 开始计数)。
    • 如果 $S_i$ 是 ‘1’,机器将内存区域设置为 $b_x$。 这里,$b_x$ 是序列 $b$ 的第 $x$ 个元素(从 $0$ 开始计数)。
  3. 机器显示最终设置在内存区域中的整数。

利用这台机器,Bitaro 想要确定写在石板上的字符串。然而,由于机器非常脆弱,查询次数不能超过 $1\,000$ 次。此外,输入到机器的整数 $m$ 的最大值应尽可能小。

请编写一个程序,利用这台机器确定写在石板上的字符串。

实现细节

你需要提交一个文件。 文件名为 ancient2.cpp。它应该实现以下函数。程序应使用预处理指令 #include 包含 ancient2.h

  • std::string Solve(int N) 该函数对每个测试用例仅调用一次。该函数应返回一个与写在石板上的字符串 $S$ 相同的字符串。
    • 参数 $N$ 是写在石板上的字符串 $S$ 的长度。
    • 该函数应返回一个长度为 $N$ 的字符串。如果长度与 $N$ 不同,你的程序将被判为 Wrong Answer [1]。
    • 返回值的每个字符必须是 ‘0’ 或 ‘1’。如果不满足此条件,你的程序将被判为 Wrong Answer [2]。
    • 返回值应与写在石板上的字符串 $S$ 相同。如果不满足此条件,你的程序将被判为 Wrong Answer [3]。

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

  • int Query(int m, std::vector<int> a, std::vector<int> b) 使用此函数,你的程序可以进行一次查询。
    • 参数 $m$ 是输入到机器的整数 $m$。
    • 参数 $a, b$ 是输入到机器的两个整数序列 $a, b$。
    • 返回值是当我们把石板放在机器上,输入上述整数和序列并进行查询时,机器显示的整数。
    • 参数 $m$ 应在 $1$ 到 $1\,002$ 之间(含 $1$ 和 $1\,002$)。如果不满足此条件,你的程序将被判为 Wrong Answer [4]。
    • 参数 $a, b$ 的长度均应等于 $m$。如果不满足此条件,你的程序将被判为 Wrong Answer [5]。
    • 参数 $a, b$ 的每个元素应在 $0$ 到 $m - 1$ 之间(含 $0$ 和 $m - 1$)。如果不满足此条件,你的程序将被判为 Wrong Answer [6]。
    • 函数 Query 的调用次数不得超过 $1\,000$ 次。如果调用次数超过 $1\,000$ 次,你的程序将被判为 Wrong Answer [7]。

说明

  • 你的程序可以实现其他内部函数,或使用全局变量。
  • 你的程序不得使用标准输入和标准输出。你的程序不得以任何方式与其他文件通信。但是,你的程序可以将调试信息输出到标准错误。

编译与测试

你可以从竞赛网页下载包含示例评测程序的压缩包来测试你的程序。压缩包中还包含你的程序的示例源文件。 示例评测程序是 grader.cpp。为了测试你的程序,请将 grader.cppancient2.cppancient2.h 放在同一目录下,并运行以下命令来编译你的程序。或者,你可以运行压缩包中包含的 compile.sh

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

编译成功后,将生成可执行文件 grader。 请注意,实际的评测程序与示例评测程序不同。示例评测程序将作为一个单一进程执行,它会从标准输入读取数据并将结果写入标准输出。

数据范围

所有输入数据满足以下条件: $N = 1\,000$。 $S$ 是一个长度为 $N$ 的字符串。 * 字符串 $S$ 的每个字符要么是 ‘0’,要么是 ‘1’。

评分

如果你的程序在任何测试用例中被判为 Wrong Answer,则该任务得分为 $0$。 如果你的程序在所有测试用例中都被判为正确,则你的得分由所有测试用例中函数 Query 的参数 $m$ 的最大值 $M$ 计算得出。如果你的程序在不调用 Query 函数的情况下被判为正确,则得分按 $M = 0$ 计算。

  • 如果 $103 \le M \le 1\,002$,你的得分为 $10 + \lfloor \frac{(1002-M)^2}{9000} \rfloor$ 分。
  • 如果 $0 \le M \le 102$,你的得分为 $100$ 分。

这里 $\lfloor x \rfloor$ 是不超过 $x$ 的最大整数。

样例

假设写在石板上的字符串 $S$ 是 “110”。如果我们把石板放在机器上,输入 $(m, a, b) = (4, [3, 3, 2, 2], [2, 2, 1, 0])$,并进行查询,机器将按以下方式运行:

  1. 机器将内存区域设置为 $0$。
  2. 对于第一次操作,由于 $S_0$ 是 ‘1’,机器将内存区域设置为 $b_0$,即 $2$。
  3. 对于第二次操作,由于 $S_1$ 是 ‘1’,机器将内存区域设置为 $b_2$,即 $1$。
  4. 对于第三次操作,由于 $S_2$ 是 ‘0’,机器将内存区域设置为 $a_1$,即 $3$。
  5. 由于最终设置在内存区域中的整数是 $3$,机器显示 $3$。

请注意,此示例输入不满足 $N = 1\,000$ 的约束。 在可以从竞赛网页获得的压缩包文件中,sample-02.txt 满足该约束。

Editorials

IDTypeStatusTitlePosted ByLast UpdatedActions
EditorialOpen Official EditorialQingyu- Download

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.