QOJ.ac

QOJ

実行時間制限: 4 s メモリ制限: 4096 MB 満点: 100 コミュニケーション

#6206. 魔法卡片

統計

Pak Dengklek 将要表演一个魔术。Pak Dengklek 的助手 Pak Ganesh 有 $N$ 张编号从 $1$ 到 $N$ 的卡片。一位观众被邀请上台,从中选择 $K$ 张不同的卡片并交给 Pak Ganesh。Pak Ganesh 查看这些卡片,然后丢弃其中的一张,并将剩下的 $K - 1$ 张卡片以某种顺序留在桌子上。随后,Pak Dengklek 查看桌上的 $K - 1$ 张卡片,必须能够确定 Pak Ganesh 丢弃的是哪一张。

显然,Pak Dengklek 和 Pak Ganesh 在魔术开始后不能进行交流,但他们可以在魔术开始前确定他们的策略。你必须通过设计他们的策略来帮助他们。这一次,Pak Dengklek 和 Pak Ganesh 将使用相同的 $N$ 和 $K$ 值进行 $Q$ 次该魔术。

实现细节

你需要实现以下过程:

void init_assistant(int N, int K)
  • $N$:魔术中卡片的总数。
  • $K$:观众选择的卡片数量。
  • 此过程在任何 choose_cards 调用之前恰好被调用一次。
int[] choose_cards(int[] cards)
  • cards:一个长度为 $K$ 的数组,包含观众选择的卡片编号,按升序排列。
  • 此过程应返回 Pak Ganesh 留在桌上的 $K - 1$ 张卡片及其顺序。所有元素必须是唯一的,且存在于 cards 数组中。
  • 此过程被调用恰好 $Q$ 次。
void init_magician(int N, int K)
  • $N$:魔术中卡片的总数。
  • $K$:观众选择的卡片数量。
  • 此过程在任何 find_discarded_card 调用之前恰好被调用一次。
int find_discarded_card(int[] cards)
  • cards:一个长度为 $K - 1$ 的数组,包含留在桌上的卡片编号及其顺序。
  • 此过程应返回 Pak Ganesh 丢弃的卡片编号。
  • 此过程被调用恰好 $Q$ 次。

每个测试用例涉及一个 $N$ 和 $K$ 的单一场景。调用上述过程的程序将运行恰好两次,具体如下:

在程序的第一次运行期间: init_assistant 在任何 choose_cards 调用之前恰好被调用一次; choose_cards 被调用恰好 $Q$ 次。在每次调用中,返回的所选卡片会被存储在评分系统中。

在程序的第二次运行期间: init_magician 在任何 find_discarded_card 调用之前恰好被调用一次; find_discarded_card 被调用恰好 $Q$ 次。在每次调用中,会选择魔术的一种任意玩法,并将 choose_cards 返回的卡片作为 find_discarded_card 的输入。

特别注意,在程序第一次运行期间保存到静态变量或全局变量中的任何信息,在程序的第二次运行中均不可用。

样例

考虑以下调用:

init_assistant(5, 3)

所有魔术中将使用 5 张卡片,每次都会邀请观众选择 3 张不同的卡片。

在 Pak Ganesh 完成初始化后,考虑以下调用:

choose_cards([1, 2, 3])

这意味着观众选择了编号为 1、2 和 3 的卡片。假设 Pak Ganesh 丢弃了 1 号卡片,并将 3 号卡片放在 2 号卡片之前留在桌上,那么 choose_cards 应该返回 [3, 2]

考虑另一个可能的调用:

choose_cards([1, 3, 4])

这意味着观众选择了编号为 1、3 和 4 的卡片。假设 Pak Ganesh 丢弃了 3 号卡片,并将 1 号卡片放在 4 号卡片之前留在桌上,那么 choose_cards 应该返回 [1, 4]

假设 Pak Ganesh 已经为所有玩法留下了桌上的卡片,并考虑以下调用:

init_magician(5, 3)

Pak Dengklek 被告知与 Pak Ganesh 相同的 $N$ 和 $K$ 信息。

在 Pak Dengklek 完成初始化后,考虑以下调用:

find_discarded_card([1, 4])

这意味着 Pak Dengklek 看到桌上按该顺序排列的 1 号和 4 号卡片。这些卡片与 choose_cards([1, 3, 4]) 的返回值相同。由于 Pak Ganesh 在那次玩法中丢弃了 3 号卡片,因此 find_discarded_card 应该返回 3。

考虑另一个调用:

find_discarded_card([3, 2])

这意味着 Pak Dengklek 看到桌上按该顺序排列的 3 号和 2 号卡片。这些卡片与 choose_cards([1, 2, 3]) 的返回值相同。由于 Pak Ganesh 在那次玩法中丢弃了 1 号卡片,因此 find_discarded_card 应该返回 1。

数据范围

  • $2 \le K \le 8$
  • $K \le N \le 10\,000$
  • $1 \le Q \le 50\,000$

对于每次 choose_cards 的调用: $1 \le \text{cards}[i] \le N$ (对于每个 $0 \le i \le K - 1$)。 cards 的所有元素都是不同的。

对于每次 find_discarded_card 的调用: * 所有给定的输入与 $Q$ 次 choose_cards 的所有返回值相同,顺序随机。

子任务

  1. (5 分) $N \le 3, K = 2$
  2. (11 分) $N \le 5, K = 3$
  3. (24 分) $N \le 12, K = 6$
  4. (60 分) $K = 8$

样例评测程序

样例评测程序按以下格式读取输入: 第 1 行:$N \ K \ Q$ 第 $2 + i$ 行 ($0 \le i \le Q - 1$):观众为第 $i$ 次玩法选择的 $K$ 张卡片,按升序排列。

对于输入中顺序相同的每次玩法,如果魔术表演正确,样例评测程序会打印 Accepted: chosen_cards = <chosen_cards>; discarded_card = <discarded_card>,其中 <chosen_cards>choose_cards 返回的卡片,<discarded_card>find_discarded_card 返回的卡片。

对于每次玩法,如果魔术表演失败,样例评测程序会打印 Wrong Answer: <MSG>,其中 <MSG> 是以下之一: invalid number of chosen cardschoose_cards 返回的卡片数量不正确。 invalid chosen card numberchoose_cards 返回的任何卡片编号无效。 duplicated chosen cardschoose_cards 返回的卡片中存在两张编号相同的卡片。 wrong discarded cardfind_discarded_card 返回的卡片不正确。

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.