你是“意大利杰出面筋披萨大师”(Excellent Glutenous Ovenmasters of Italy)活动的一名记者。在这个活动中,意大利最优秀的 $N$ 位披萨烘焙师刚刚进行了一场对决,以决出谁能制作出最棒的披萨。每位烘焙师烘焙了一张披萨,随后评审团对这些披萨进行了排名。每张披萨都获得了一个唯一的排名,从 $0$(最好)到 $N - 1$(最差)。每位烘焙师也获得了与其披萨相同的排名。
比赛结束后,到了在披萨晚宴上享用披萨的时间。所有烘焙师都会参加这次活动,并且每个人都会把自己的披萨带到晚宴上。烘焙师们以某种顺序(不一定按排名)依次到达。在晚宴上,有 $M \le N$ 张桌子,编号为 $0$ 到 $M - 1$。最先到达的 $M$ 位烘焙师会按照到达顺序,将他们的披萨放在这些桌子上,依次放在桌子 $0$ 到 $M - 1$ 上。剩下的 $N - M$ 位烘焙师中的每一位都想吃一张比自己做的更好、但又不会太好(以免让他们感到自惭形秽)的披萨。每当一位烘焙师到达时,他们会选择当前所有可用披萨中比自己更好且排名最差的那张(即在所有当前桌面上、排名数值小于自己排名的可用披萨中,选择排名数值最大的那张)。他们会坐在对应的桌子旁,吃掉整张选中的披萨。最后,他们会将自己的披萨留在同一张桌子上,以便后面的烘焙师可能享用。如果对于某位到达的烘焙师来说,不存在合适的披萨(因为所有桌子上的披萨排名都比他自己的差),这位烘焙师就会感到沮丧并带着自己的披萨离开。
以下示例展示了一个拥有 $M = 2$ 张桌子、烘焙师到达排名顺序为 $1, 0, 3, 5, 4, 2$ 的晚宴。该晚宴对应于第一个样例输入和输出。
图 1:前 $M = 2$ 位烘焙师按照到达顺序将他们的披萨放在空桌子(0, 1)上。
图 2:一旦所有桌子都被占用,每位新到达的烘焙师都会走到放有比自己更好且最差的披萨的桌子旁(如箭头所示),吃掉那张披萨,并留下自己的披萨。如果不存在更好的披萨,烘焙师会沮丧地离开(无箭头)。
在你的文章中,你想报道烘焙师们到达披萨晚宴的顺序。不幸的是,你被所有美味的披萨分散了注意力,忘记记录烘焙师们到达的顺序。幸运的是,在每张桌子上,你都可以找到一叠在该桌子上提供过服务的披萨托盘,其顺序正是这些披萨被提供服务的顺序。
图 3:对应于第一个样例的托盘堆栈。每个堆栈按到达顺序(从底部的“首次到达”到顶部的“最近一次”)列出了曾在该桌子上的烘焙师。高亮的托盘表示晚宴结束时留在该桌子上的披萨。
你想利用这些信息来重建烘焙师到达的顺序。你意识到可能存在多种可能的顺序,因此,为了获得满分,你需要报告字典序最小的有效顺序。
一个序列 $a_0, a_1, \dots, a_{n-1}$ 比序列 $b_0, b_1, \dots, b_{n-1}$ 字典序更小,是指存在一个索引 $0 \le t < n$,使得对于所有 $i < t$ 都有 $a_i = b_i$,且 $a_t < b_t$。
输入格式
第一行包含两个整数 $N$ 和 $M$,分别表示烘焙师的数量和桌子的数量。
接下来的 $M$ 行,每行描述一张桌子上的托盘堆栈。第 $i$ 行以一个整数 $T_i$ 开始,表示桌子 $i$ 上的托盘数量,紧接着是 $T_i$ 个整数 $b_{i,j}$,表示在桌子 $i$ 上提供服务的第 $j$ 张披萨的排名(按提供服务的先后顺序,即从底到顶)。
输出格式
如果不存在满足约束条件的可能顺序,输出 NO。
如果存在可能的顺序,输出 YES。在这种情况下,在第二行输出 $N$ 个整数 $a_0, a_1, \dots, a_{N-1}$,表示烘焙师按到达顺序排列的排名。如果存在多个这样的排列,你应该输出其中字典序最小的一个。请注意,部分正确的答案仍可能获得一些分数,具体说明见“评分”部分。
数据范围
- $1 \le M \le N \le 300\,000$。
- $0 \le b_{i,j} \le N - 1$。
- 所有的 $b_{i,j}$ 互不相同。
- $1 \le T_i \le N$。
评分
你的程序将在分组成多个子任务的测试用例上进行测试。要获得某个子任务的分数,你必须正确解决其中包含的所有测试。
| 评分规则 |
|---|
仅第一行正确(YES 或 NO)的解法将获得 20% 的分数。当答案为 YES 时,第一行正确且给出了任意有效顺序(不一定是字典序最小)的解法将额外获得 20% 的分数。要获得剩余的 60% 分数,当第一行为 YES 时,你必须输出字典序最小的有效顺序。 |
- Subtask 0 [0 分]:样例。
- Subtask 1 [20 分]:$M = 1$。
- Subtask 2 [10 分]:$M = 2$,$N \le 200$,且所有 $T_i$ 的总和为 $N$(换句话说,没有烘焙师沮丧地离开)。
- Subtask 3 [20 分]:$M \le N \le 200$,且所有 $T_i$ 的总和为 $N$(换句话说,没有烘焙师沮丧地离开)。
- Subtask 4 [20 分]:$M \le 10$。
- Subtask 5 [30 分]:无附加限制。
样例
输入样例 1
6 2 3 1 3 5 2 0 4
输出样例 1
YES 1 0 3 5 4 2
输入样例 2
6 2 3 1 3 4 2 0 2
输出样例 2
NO
输入样例 3
4 2 2 0 3 2 1 2
输出样例 3
NO
输入样例 4
3 1 2 0 2
输出样例 4
YES 0 2 1
输入样例 5
8 1 8 7 6 5 4 3 2 1 0
输出样例 5
NO
输入样例 6
12 4 3 2 3 4 1 5 1 6 5 7 8 9 10 11
输出样例 6
YES 2 5 6 7 0 1 3 4 8 9 10 11
说明
第一个样例输入和输出对应于题目描述中给出的图示。特别地,在图 1 和图 2 中,烘焙师到达晚宴的顺序是字典序最小的有效到达顺序 $1, 0, 3, 5, 4, 2$。
在第二个样例中,托盘堆栈是不一致的,因为不存在任何一种到达顺序能让排名为 $5$ 的烘焙师沮丧地离开。因此,答案是 NO。
在第三个和第五个样例中,托盘堆栈也是不一致的(没有任何到达顺序可以产生它们),因此答案是 NO。
在第四个样例中($N = 3, M = 1$),只有一种可能的到达顺序,即 $0, 2, 1$。
在第六个样例中($N = 12, M = 4$),请注意数字 $0$ 和 $1$ 没有出现在任何 $b_{i,j}$ 中。这意味着在晚宴的某个时刻,烘焙师 $0$ 和 $1$ 都沮丧地离开了。样例输出显示了字典序最小的有效到达顺序。还存在其他有效的到达顺序;例如 $2, 5, 6, 7, 8, 1, 3, 4, 9, 10, 11, 0$。如果输出 YES 紧接着输出像这样另一个有效顺序(而不是字典序最小的那个),将获得该测试点 40% 的分数。