QOJ.ac

QOJ

Límite de tiempo: 3 s Límite de memoria: 1024 MB Puntuación total: 26 Interactivo

#12420. ESAb ATAd

Estadísticas

去年,一个研究联盟的分布式数据库系统出现了一些故障,导致部分数据丢失。你不需要阅读或理解那个问题来解决这道题!

该联盟认为分布式系统过于复杂,因此他们将 $B$ 位重要信息存储在单台机器的单个数组中。作为额外的安全层,他们增加了获取信息的难度;用户必须查询 $1$ 到 $B$ 之间的某个位位置,然后接收该位作为响应。

不幸的是,这台超现代机器会受到随机量子涨落的影响!具体来说,在发送第 $1$ 次、第 $11$ 次、第 $21$ 次、第 $31$ 次……等查询之后,但在给出响应之前,量子涨落会以相等的概率导致以下四种效应之一:

  • $25\%$ 的时间,数组被取反:每个 $0$ 变为 $1$,反之亦然。
  • $25\%$ 的时间,数组被反转:第一位与最后一位交换,第二位与倒数第二位交换,依此类推。
  • $25\%$ 的时间,数组同时发生上述两种变化(取反和反转)。(注意,它们发生的顺序无关紧要。)
  • $25\%$ 的时间,数组不发生任何变化。

此外,没有任何迹象表明每次量子涨落产生了什么影响。该联盟现在很担心,并雇佣你找回其珍贵的数据,无论它处于什么形式!你能找到整个数组,使得你的答案在你给出答案的那一刻是准确的吗?回答问题不计入查询次数,因此,如果你在第 $30$ 次查询后回答,数组将与你在第 $21$ 次到第 $30$ 次查询后的状态相同。

输入格式

这是一个交互式问题。请确保你已阅读 FAQ 中关于交互式问题的部分。

最初,你的程序应读取一行,包含两个整数 $T$ 和 $B$:测试用例的数量和数组中的位数。注意,$B$ 对于每个测试用例都是相同的。

然后,你需要处理 $T$ 个测试用例。在每个测试用例中,裁判从一个预定的 $B$ 位数组开始;注意,该数组在不同的测试用例中可能不同,且不一定是随机选择的。

然后,你可以进行最多 $150$ 次以下形式的查询:

  • 你的程序输出一行,包含一个 $1$ 到 $B$ 之间的整数 $P$,表示你希望查看数组中的哪个位置。
  • 如果你目前进行的查询次数除以 $10$ 的余数为 $1$,裁判会从上述四种可能性(取反、反转、取反+反转或无变化)中均匀随机且独立地选择一种,并相应地改变存储的数组。(注意,这会在你进行的第一次查询时发生。)
  • 裁判返回一行,包含一个字符 $0$ 或 $1$,即它当前在位置 $P$ 存储的值,或者如果你提供了格式错误的行(例如无效位置),则返回 $N$。

在你进行了任意多次上述查询后,你必须进行最后一次以下形式的交换:

  • 你的程序输出一行,包含一个由 $B$ 个字符组成的字符串,每个字符都是 $0$ 或 $1$,表示当前存储在数组中的位(这不一定与最初存在的位匹配!)。
  • 裁判返回一行,包含一个字母:如果你的答案正确,则返回大写字母 $Y$;如果答案不正确(或者你提供了格式错误的行),则返回大写字母 $N$。如果你收到 $Y$,你应该开始下一个测试用例,或者如果没有更多测试用例,则停止发送输入。

在裁判向你的输入流发送 $N$ 后,它将不会发送任何其他输出。如果你的程序在收到 $N$ 后继续等待裁判,你的程序将超时,导致 Time Limit Exceeded 错误。请注意,你有责任让你的程序及时退出以接收 Wrong Answer 判决,而不是 Time Limit Exceeded 错误。通常情况下,如果超过内存限制或程序出现运行时错误,你将收到相应的判决。

数据范围

时间限制:每个测试集 40 秒。 内存限制:1GB。 $1 \le T \le 100$。

测试集 1 (可见判决)

$B = 10$。

测试集 2 (可见判决)

$B = 20$。

测试集 3 (隐藏判决)

$B = 100$。

样例

以下交互对应测试集 1。

t, b = readline_int_list() // 读取 100 到 t,10 到 b。
// 裁判以该测试用例的预定数组开始:
// 0001101111。(注意:实际的测试集 1 不一定使用此数组。)
printline 1 to stdout // 我们询问位置 1。
flush stdout
// 由于这是我们的第 1 次查询,且 1 mod 10 为 1,裁判秘密且随机地选择上述四种量子涨落效应之一。
// 它恰好选择了取反 + 反转,所以现在存储的值是 0000100111。
r = readline_chr() // 读取 0。
printline 6 to stdout // 我们询问位置 6。
flush stdout
// 由于这是我们的第 2 次查询,且 2 mod 10 为 2,裁判不选择量子涨落效应。
r = readline_chr() // 读取 0。
...
// 我们在此示例中省略了第三到第十次查询。
...
printline 1 to stdout // 我们决定再次询问位置 1。
flush stdout
// 由于这是我们的第 11 次查询,且 11 mod 10 为 1,裁判秘密且随机地选择一个量子涨落效应,
// 恰好得到反转,所以现在存储的值是 1110010000。
r = readline_chr() // 读取 1。
printline 1110110000 to stdout // 我们尝试回答。为什么?!?!
flush stdout
ok = readline_chr() // 读取 N -- 我们犯了一个错误!
exit // 退出以避免歧义的 TLE 错误

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.