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 的所有返回值相同,顺序随机。
子任务
- (5 分) $N \le 3, K = 2$
- (11 分) $N \le 5, K = 3$
- (24 分) $N \le 12, K = 6$
- (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 cards:choose_cards 返回的卡片数量不正确。
invalid chosen card number:choose_cards 返回的任何卡片编号无效。
duplicated chosen cards:choose_cards 返回的卡片中存在两张编号相同的卡片。
wrong discarded card:find_discarded_card 返回的卡片不正确。