约束条件
- 。
- 为 (只有样例符合)、、 或 。
- 对于每个测试数据,你最多可以进行 次查询。
评分方式
你的程序将在分成若干子任务的测试数据上进行测试。 要获得某个子任务的分数,你必须正确解出该子任务中所有的测试数据。
- 子任务 [ 分]: 样例 ()。
- 子任务 [ 分]: 。
- 子任务 [ 分]: ,且宾客 和 坐在一起。
- 子任务 [ 分]: 。
- 子任务 [ 分]: 。
对于子任务 1 和 2,任何能正确解决所有测试数据的解法都将获得全部分数。
对于子任务 3 和 4,你的解法必须正确解决所有测试数据才能得分,且你的得分取决于 ,即你解决一个测试数据所需的最大查询次数。设 。子任务 3 和 4 的得分计算如下:
对于每个子任务, 的值四舍五入到最接近的整数,总分是各子任务得分之和。为了获得满分,你需要在子任务 3 中最多使用 55 次查询,在子任务 4 中最多使用 2597 次查询。子任务 3 和 4 的 样例值及对应得分如下表所示。
:::align{center}
:::
样例解释
样例输入包含一个测试数据 (),其中 位宾客。此测试数据中的隐藏宾客配置对应于图 1。
程序进行的第一次查询是 0, 2, 4。该查询的答案 3 告诉我们,这些宾客以某种未知顺序坐在三个相邻的座位上。
第二个查询的答案 3 告诉我们关于宾客 3、0 和 1 也是如此。
我们现在可以推断出宾客 0 一定坐在中间,宾客 2 和 4 在一侧,宾客 1 和 3 在另一侧。
第三次查询后,我们已经确定宾客一定以 的顺序或反向顺序 就座。我们可以输出这两种顺序中的任意一种。
代码模板和评测详情
我们强烈建议使用提供的 C++ 和 Python 代码模板。这些模板会检查与评测程序的交互是否成功,并在交互失败时优雅地终止程序。
与你程序交互的评测程序在遇到第一个错误时会进行报错,然后终止。如果你不使用提供的模板,这可能会导致你的程序崩溃或一直等待响应。
我们也建议使用测试工具(见下文)在提交前进行本地测试。测试工具会检查你程序的输出并报告协议违规情况(protocol violations)。
测试工具
为了方便你测试程序,我们提供了一个可以下载的简单工具。该工具是可选的。注意,洛谷使用的评测程序与测试工具不同。
要使用该工具,你需要一个输入文件。你可以使用提供的样例输入 seatingplan.input0.txt 或者自己创建一个。输入文件应以包含测试数据数量 的行开头,然后每个测试数据占用两行:一行包含 ,另一行包含 。
对于 Python 程序,假设为 seatingplan.py(通常以 pypy3 seatingplan.py 运行),按如下方式运行测试工具:
python3 testing_tool.py pypy3 seatingplan.py < seatingplan.input0.txt
对于 C++ 程序,先编译你的程序:
g++ -DEVAL -std=gnu++20 -O2 -pipe -static -s -o seatingplan seatingplan.cpp
然后运行测试工具:
python3 testing_tool.py ./seatingplan < seatingplan.input0.txt