QOJ.ac

QOJ

Limite de temps : 3 s Limite de mémoire : 512 MB Points totaux : 100 Hackable ✓

#16553. Snake Instructions

Statistiques

题目描述

这是一个交互题。

数轴上有 $n$ 条蛇。第 $i$ 条蛇在位置 $a_i$,速度为 $s_i$。你已知每条蛇的位置,并且每条蛇的速度是 $0$ 到 $2$ 的整数,但你不知道具体每条蛇的速度。保证没有两条蛇处于相同的位置。

为了确定所有蛇的速度,你最多可以进行 $3$ 次指令。每条指令应以长度为 $m$ 的二进制字符串给出,字符串只包含 L 和 R ($1 \leq m \leq 4n$)。收到这条指令后,所有蛇会运动 $m$ 秒。在第 $i$ 秒,如果 $s_i=$ L,则所有蛇向左运动一秒,否则全部蛇向右运动一秒。如果在某一时刻(包括非整数秒时),有两条蛇处于相同的位置,则速度快的那条蛇被移除。$m$ 秒后,你会获得剩下的蛇的数量 $k$,以及所有剩余蛇的位置。注意,每次指令都是独立的——也就是说,所有蛇都会复活回到起始位置再开始新的操作。

你的任务是确定所有蛇的速度。然而,可能存在无法确定某一条蛇的速度的情况,如果碰到这种情况,你需要输出 $-1$。只有当无论给出哪一组最多 $3$ 条指令都无法确定某条蛇的速度时,才能输出 $-1$。如果存在至多 $3$ 条指令能唯一确定所有蛇的速度而你输出了 $-1$,你会得到 Wrong Answer 判决。同理,如果本应该输出 $-1$ 却没有输出也会判错,即使你“猜”对了速度。

输入格式

每个测试包含多个测试用例。第一行为用例数量 $t$($1 \le t \le 10^3$),随后是所有用例的描述。

每个用例的第一行为整数 $n$,即蛇的数量($2 \leq n \leq 10^5$)。

第二行包含 $n$ 个整数 $a_1,a_2,\ldots,a_n$($1 \le a_1 \lt a_2 \lt \ldots \lt a_n \le 4n$),表示所有蛇的初始位置。

保证所有用例的 $n$ 之和不超过 $10^5$。

输出格式

交互说明

读入所有蛇的位置后,开始交互。每次发出指令需按以下格式输出一行:

  • ? s

你需保证 $s$ 只由字母 LR 组成,且长度在 $1$ 到 $4n$ 之间。

评测器会返回如下格式的一行:

  • $k\ b_1\ b_2\ \ldots\ b_k$($1 \le k \le n, -10^9 \leq b_1 \lt b_2 \lt \ldots \lt b_k \le 10^9$)

其中 $k$ 表示指令后剩余蛇的数量,$b_1,b_2,\ldots,b_k$ 为它们的最终位置。

当你准备好输出答案时,输出一行:

  • 如果无法确定所有蛇的速度,输出 ! -1
  • 否则,输出 ! s_1 s_2 \ldots s_n($0 \leq s_i \leq 2$),其中 $s_i$ 表示第 $i$ 条蛇的速度。

输出答案不计入指令次数。

之后继续下一个用例或程序最后终止。

交互器不自适应,即所有蛇的速度在整个过程都保持不变,并保证输入合法——即所有信息与各自速度兼容。

每次输出查询后请务必换行并刷新输出缓冲,否则会收到 Idleness limit exceeded 的判决。

若某一步收到 $-1$,表示你有非法查询或其他错误,应立即退出,否则程序继续读取已关闭流会导致不可预期的判决。

Hack 格式

自定义 hack 时,输入如下格式:

第一行为整数 $t$,即用例数($1 \leq t \leq 10^3$)。

每个用例的第一行为 $n$($2 \leq n \leq 10^5$)。

第二行为 $n$ 个整数 $a_1,a_2,\ldots,a_n$($1 \leq a_1

第三行为 $n$ 个整数 $s_1,s_2,\ldots,s_n$($0 \leq s_i \leq 2$),表示每条蛇的速度。

所有用例的 $n$ 之和不超过 $10^5$。

要刷新输出缓冲:

  • C++:fflush(stdout) 或 cout.flush();
  • Python:sys.stdout.flush();
  • 其它语言请查阅相关文档。

输入输出样例 #1

输入 #1

7
2
1 2

1 1

2
1 6

2 1 4

3
2 3 4

2 2 4

3
2 3 4

3 5 6 7

5
1 3 8 14 15

5
1 2 3 4 5

4
5 6 7 8

输出 #1

? L

! 0 1


? LRLL

! 0 1


? RRR

! -1


? RRR

! 1 1 1


! 2 1 0 0 1


! 0 2 2 2 0


! 0 1 2 0

说明/提示

在第一个用例中,两条蛇速度分别为 $0$ 和 $1$。程序首先给出指令 L。右边那条蛇从 $2$ 移动到 $1$,而左边的蛇不动。此时两条蛇都在 $1$,速度较大的蛇(右边那只)被移除。因此只剩下一条蛇在位置 $1$。此时程序猜测两条蛇的速度分别为 $0$ 和 $1$,这是正确的。注意,尽管速度 $[0,2]$ 也会导致最后只剩一只蛇在 $1$,但不能直接输出 $-1$,因为还可以通过另一组指令区分 $[0,2]$ 和 $[0,1]$。

在第三个用例中,可以确定第一条蛇和第三条蛇的速度均为 $0$,且可以证明无论如何无法区分中间那条蛇的速度是 $1$ 还是 $2$,因此输出 $-1$ 是正确的。

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.