QOJ.ac

QOJ

Límite de tiempo: 2.0 s Límite de memoria: 1024 MB Puntuación total: 100 Interactivo

#18558. Find a Better String

Estadísticas

这是一个交互式问题。你必须在输出每行后立即执行清空缓冲区(flush)操作。例如,在 C++ 中你应该使用 fflush(stdout)cout.flush(),在 Java 或 Kotlin 中使用 System.out.flush(),在 Python 中使用 sys.stdout.flush()

对于一个长度为 $n$ 的 01 字符串 $s$(由字符 0 和/或 1 组成的字符串),我们将其代价(cost)定义为满足以下约束的整数 $x$ 的数量:

  • 存在两个整数 $i, j$ 满足 $1 \le i, j \le n$,$i + j = x$ 且 $s_i \ne s_j$。

例如,字符串 11001 的代价为 $5$:满足条件的 $x$ 值为 $4, 5, 6, 8$ 和 $9$。

评测机拥有一个由 $n$ 个字符组成的 01 字符串 $b$。你会得到 $n$ 的值,但你不知道 $b$。你的目标是找到另一个长度相同且代价严格大于 $b$ 的字符串 $b'$,或者报告不存在这样的字符串。

在给出答案之前,你最多可以进行 $3$ 次如下形式的询问:

  • ? l r — 询问评测程序 $b_l, b_{l+1}, \dots, b_r$ 中不同字符的数量。

给出答案不计入询问次数。

在每个测试点中,字符串 $b$ 是预先确定的。换句话说,交互器不是自适应的(non-adaptive)。

交互格式

起初,评测程序会输出一行,包含一个整数 $t$ ($1 \le t \le 500$) —— 测试组数。

处理每组测试数据时,评测程序首先会输出一行,包含一个整数 $n$ ($3 \le n \le 100$) —— $b$ 的长度。

要进行询问,你应该输出一行,格式如下:

  • ? l r ($1 \le l \le r \le n$)

作为响应,评测程序将输出一行,包含一个整数 —— $b_l, b_{l+1}, \dots, b_r$ 中不同字符的数量。如果你的询问不合法,或者你超过了允许的最大询问次数,该整数将为 $0$。在收到 $0$ 作为回答后,你的程序必须立即终止,否则你的提交结果可能是未定义的(undefined)。

要给出答案,你应该输出以下两种格式之一的一行:

  • NO(如果不存在与 $b$ 长度相同且代价严格更大的字符串 $b'$);
  • YES b'(如果至少存在一个这样的字符串。你可以选择任何满足条件的字符串 $b'$)。

在你给出答案后,评测程序会输出一行,包含一个整数:

  • $0$ 如果你的答案错误(在这种情况下,你的程序必须立即终止,否则你的提交结果可能是未定义的);
  • $1$ 如果你的答案正确(在这种情况下,你可以继续处理下一组测试数据,如果这是最后一组测试数据,则终止程序)。

在输出任何内容后,请不要忘记清空输出缓冲区(flush)。否则,你可能会得到 "Idleness Limit Exceeded"(空闲超限)的结果。

样例

输入 1

3 // 测试组数
3 // n = 3
1 // b[1..3] 中有 1 种不同的字符
1 // 答案正确
3 // n = 3
2 // b[1..3] 中有 2 种不同的字符
1 // b[1..2] 中有 1 种不同的字符
1 // 答案正确
5 // n = 5
2 // b[1..5] 中有 2 种不同的字符
1 // b[1..4] 中有 1 种不同的字符
1 // 答案正确

输出 1

? 1 3 // 询问 b[1..3]
YES 010 // 字符串 010 更好
? 1 3 // 询问 b[1..3]
? 1 2 // 询问 b[1..2]
NO // 没有更好的字符串
? 1 5 // 询问 b[1..5]
? 1 4 // 询问 b[1..4]
YES 11001 // 字符串 11001 更好

说明

样例展示了在 $t = 3$ 且各测试组中的字符串分别为 00011011110 时的一种可能交互过程。该测试点即为本题的第一个实际测试点。

请注意,// 符号后面的所有内容均为注释,用于解释交互中每一行的含义。在实际评测中,评测程序不会输出这些注释,你也不应该输出它们。空行同样是为了方便阅读而添加的,评测程序不会输出空行,你的程序也不应该输出任何空行。

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.