P13854 [CERC 2023] Jumbled Stacks

题目描述

我们有一组 $n$ 张卡片,标号从 $1$ 到 $n$,它们被分配到 $k$ 个牌堆中,记为 $S_1, S_2, \ldots, S_k$。每个牌堆都有容量限制:第 $i$ 个牌堆 $S_i$ 最多能容纳 $C_i$ 张卡片。我们唯一可以进行的操作是:从某个牌堆的顶部取出一张卡片,将其移动到 **另一个** 牌堆的顶部(前提是不会超过目标牌堆的容量)。 通过若干次这样的操作,我们希望将卡片重新排列,使得满足以下条件: 1. 从 $S_1$ 开始的若干个牌堆(可能是 $0$ 个或更多)被完全填满; 2. 紧接着的下一个牌堆未被填满(甚至可能为空); 3. 后面的所有牌堆完全为空; 4. 如果我们把所有牌堆依次从 $S_1$ 在底部到 $S_k$ 在顶部依次堆叠起来,卡片应当从下到上严格升序排列,即 $1$ 在最底部,$n$ 在最顶部。 题目保证以下条件成立: $$ n \leq \left( \sum_{i=1}^{k} C_i \right) - \max_{1 \leq i \leq k} C_i $$ 例如,假设我们有 $n = 6$ 张卡片,$k = 3$ 个牌堆,且容量分别为 $C_1 = 4$, $C_2 = C_3 = 3$。初始状态如下(牌堆从底到顶给出,$0$ 表示该位置为空): - $S_1 = [2, 3, 0, 0]$ - $S_2 = [4, 1, 6]$ - $S_3 = [5, 0, 0]$ 那么目标状态是: - $S_1 = [1, 2, 3, 4]$ - $S_2 = [5, 6, 0]$ - $S_3 = [0, 0, 0]$

输入格式

第一行包含两个整数 $n$ 和 $k$,分别表示卡片的数量和牌堆的数量。 接下来的 $k$ 行描述初始状态:第 $i$ 行描述第 $i$ 个牌堆 $S_i$,包含 $C_i + 1$ 个整数: - 第一个整数为 $C_i$,表示牌堆容量; - 随后的 $C_i$ 个整数为牌堆中卡片的编号,从底部到顶部依次给出; - 如果该牌堆中的卡片数少于 $C_i$,则最后几个数用 $0$ 表示。

输出格式

输出一系列操作,每行两个整数 $a, b$,表示将一张卡片从牌堆 $S_a$ 的顶部移动到牌堆 $S_b$ 的顶部($1 \leq a, b \leq k$ 且 $a \neq b$)。 操作总数不能超过 $10^5$。 在所有操作结束后,输出一行:`0 0`。如果有多种可能的解法,可以输出任意一种。

说明/提示

### 注释 这是题面中给出的示例。上面的输出展示了 14 次移动操作,使牌堆达到期望状态。 ### 输入限制 - $1 \leq n \leq 100$ - $3 \leq k \leq 100$ - $1 \leq C_i \leq n$