QOJ.ac

QOJ

Time Limit: 10 s Memory Limit: 1024 MB Total points: 21 Interactive

#12489. GoroSort 的复仇

Statistics

在本题中,当提到“随机选择”时,意味着从所有有效可能性中均匀随机选择,且独立于任何其他选择。

Code Jam 的参赛者们曾经帮助强大的 Goro 对一个整数数组进行排序。(你不需要阅读那道题目也能解决这一题。)现在,Goro 又需要你的帮助了。他有 $N$ 个盒子在桌子上排成一行,从左到右编号为 $1$ 到 $N$。每个盒子里恰好有一个球。球的编号也是 $1$ 到 $N$。Goro 希望对于所有的 $i$,球 $i$ 最终都在盒子 $i$ 中。也就是说,他希望球按排序后的顺序排列。遗憾的是,初始状态并非如此。

当 Goro 用他强有力的拳头撞击桌子时,球会弹到空中并落回盒子里。Goro 可以非常精确地操作,使得每个盒子里恰好落入一个球。球可能落入它原来所在的盒子,也可能落入不同的盒子。

更好的是,Goro 还有在每次撞击前为盒子分配颜色的能力。然后,他可以以某种方式撞击桌子,使得从颜色为 $c$ 的盒子中出来的球总是落入颜色为 $c$ 的盒子中。尽管这种准确性令人印象深刻,但 Goro 对此并没有更多的控制权。在每种颜色内部,球最终被随机分配到各个盒子中。

例如,假设球以 $1, 4, 3, 6, 5, 2$ 的顺序出现(如上图所示)。他可以选择——不一定是最优的——将第一个盒子设为红色,第二个和第六个盒子设为绿色,第三到第五个盒子设为蓝色。然后,在 Goro 撞击桌子后:

  • 第一个盒子里的 $1$ 落回同一个盒子,因为那是唯一的红色盒子。
  • 第二个和第六个盒子里的 $4$ 和 $2$ 以 $\frac{1}{2}$ 的概率保持原位,以 $\frac{1}{2}$ 的概率交换位置。
  • 第三、第四和第五个盒子里的 $3, 6, 5$ 以 $\frac{1}{6}$ 的概率最终以以下顺序之一排列:
    • $3, 6, 5$
    • $3, 5, 6$
    • $6, 3, 5$
    • $6, 5, 3$
    • $5, 3, 6$
    • $5, 6, 3$

因此,例如,撞击后球的顺序为 $1, 2, 3, 5, 6, 4$ 的概率为 $\frac{1}{12}$。如果 Goro 得到了这个或其他未排序的结果,他将不得不为下一轮指定一组盒子颜色,依此类推,直到他最终得到排序后的 $1, 2, 3, 4, 5, 6$。在每次撞击前,Goro 可以以任何方式为盒子分配颜色,而无需考虑之前的分配。

你能帮助 Goro 实现一个更有效的策略来对球进行排序吗?保证球初始时处于随机的未排序状态。

输入格式

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

程序首先应读取一行,包含三个整数 $T, N, K$:测试用例数量、每个测试用例的盒子数量,以及所有测试用例总共允许的撞击次数。然后,处理 $T$ 个测试用例。

每个测试用例开始时,裁判会发送一行包含 $N$ 个整数的内容,每个整数从 $1$ 到 $N$ 出现且仅出现一次,该列表是从所有未排序的列表中随机选择的。然后你必须与裁判进行一系列交互。每次交互的工作方式如下:

  • 你发送一行包含 $N$ 个整数 $C_1, C_2, \dots, C_N$ 的内容,其中每个整数在 $1$ 到 $N$ 之间(含)。每个 $C_i$ 表示你为下一次撞击将盒子 $i$ 分配了颜色 $C_i$。你可以选择有多少种颜色以及它们如何编号,但你必须为每个盒子分配一种颜色。
  • 裁判模拟题目中解释的撞击过程。如果这导致球处于排序状态:
    • 如果这是所有测试用例中的第 $K$ 次交互,且这不是最后一个测试用例,裁判会发送一行包含整数 $-1$ 的内容,并不再输出任何内容。
    • 否则,裁判会发送一行包含整数 $1$ 的内容,然后立即开始下一个测试用例(如果有的话)。如果这是最后一个测试用例,你的程序必须无错误地退出,且不再发送任何内容。
  • 否则,球未排序,且:
    • 如果这是所有测试用例中的第 $K$ 次交互,或者你提供了无效的行(例如,整数过少,或颜色编号超出范围),裁判会发送一行包含整数 $-1$ 的内容,并不再输出任何内容。
    • 如果这不是你的第 $K$ 次交互,裁判会发送一行包含整数 $0$ 的内容,然后是另一行包含 $N$ 个整数的内容,每个整数从 $1$ 到 $N$ 出现且仅出现一次,且处于未排序状态,代表球的新顺序,即这些整数中的第 $i$ 个是落入盒子 $i$ 的球。然后你必须开始另一次交互。

通常情况下,如果超过内存限制或程序出现运行时错误,你将收到相应的判决。此外,如果你的程序在收到 $-1$ 后继续等待裁判,你的程序将超时,导致“时间限制超限”(Time Limit Exceeded)错误。请注意,你有责任让你的程序及时退出,以接收“答案错误”(Wrong Answer)判决,而不是“时间限制超限”错误。

请注意,裁判每次使用相同的随机源,因此在没有其他错误(如时间限制超限、内存限制超限)的情况下,提交完全相同的代码两次将产生相同的结果。

数据范围

时间限制:20 秒。 内存限制:1 GB。 $T = 1000$。 $N = 100$。

子任务

  • 测试集 1(可见判决):$K = 16500$。
  • 测试集 2(可见判决):$K = 12500$。
  • 测试集 3(可见判决):$K = 11500$。

样例

输入格式 1

2 4 8
1 4 3 2
0
1 4 3 2
1
2 1 4 3
1

输出格式 1

1 2 3 2
1 2 3 2
4 4 4 4

说明

样例交互并不满足任何测试集的约束。它仅用于阐明输入和输出格式。

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.