P7877 「SWTR-7」Spider Solitaire

题目背景

#### 题目描述下方有简化题意。 ![](https://cdn.luogu.com.cn/upload/image_hosting/7tdo8cdf.png) --- 小 A 在玩蜘蛛纸牌。 为了方便你理解蜘蛛纸牌,小 A 给出了简化后的游戏规则: - 一副牌有 $n$ 张,从小到大分别为 $1,2,\cdots,n$。 - 现有 $m$ 个牌堆,$1$ 副牌。每个牌堆中有 $0$ 张或多张牌。 - 定义「龙」$a_1,a_2,\cdots,a_d$ 为满足 $a_i-1=a_{i+1}\ (1\leq i

题目描述

给定一个蜘蛛纸牌初始局面,小 A 想知道能否获得胜利。若能,请输出 $\texttt{YES}$ 以及**获胜所需的最小步数**。否则输出 $\texttt{NO}$。 小 A 还想知道,对于每张牌 $i$,如果要移动 $i$ 至少需要多少步,**包括移动 $i$ 的这一步**。如果无法移动输出 `-1`。 --- #### 「简化题意」 有 $m$ 个**横向**的数堆,数堆里共有 $n$ 个数,每个数堆里有 $0$ 或多个数。所有数堆里的数组成了 $1\sim n$ 中的所有数。 你可以将一个数堆**最右边递减且公差为 $-1$ 的**连续若干个数 $a_1,a_2,\cdots,a_c$ **按照原来的顺序移到另外一个非空数堆的最右边**,当且仅当该非空数堆最右边的一个数 $b=a_1+1$。 求将所有的 $n$ 个数都移动到同一个数堆且满足从左往右依次递减的最小步数。如果无解输出 $\texttt{NO}$。 **此外,你还需要对于每个数 $i$,输出如果要移动 $i$ 至少需要多少步。**

输入格式

第一行一个整数 $T$,表示子任务编号。 第二行两个整数 $n,m$,分别表示一副牌的张数和牌堆的个数。 接下来 $m$ 行,每行首先一个整数 $c$ 表示该牌堆中牌的个数,接下来 $c$ 个整数 $b_1,b_2,\cdots,b_c$ **从左到右**描述这个牌堆。

输出格式

如果能够获胜,在第一行输出 $\texttt{YES}$,**第二行输出最少步数**。否则输出一行 $\texttt{NO}$。 无论是否能够获胜,你还需输出 $n$ 行,第 $i$ 行一个**介于 $-1$ 与 $n$ 之间的整数**,表示移动 $i$ 至少需要多少步。

说明/提示

**「样例 1 说明」** 因为 1,2,3,4,5 可以直接移动,所以至少需要 1 步即可移动。 因为需要先将 5 移至 6 右侧,6 才能移动,所以至少需要 2 步即可移动。 因为需要先将 5 移至 6 右侧,再将 4,3,2,1 移至 5 右侧,7 才能移动,所以至少需要 3 步即可移动。 显然 8,9 无法移动。 **「Special Judge」** 本题使用 Special Judge,请**严格遵守输出格式**: - 如果你正确输出对能否获胜的判定,且如果能够获胜,你正确输出最小步数,你将获得该测试点**至少** $40\%$ 的分数。 - **在上一部分的基础上**,如果你正确输出移动每张牌的最小步数,你将获得该测试点**剩下** $60\%$ 的分数。也就是说,如果你上一部分输出错误,你在这一部分也不会获得任何分数。 - **如果你的输出格式错误,你将获得该测试点 $0\%$ 的分数**,包括但不限于**只输出对能否获胜的判定**。 - 需要特别注意的是,如果你不能正确求出移动每张牌的最小步数,请**随机输出 $[-1,n]$ 之间的任意整数**,否则你将获得该测试点 $0\%$ 的分数。 - 每行结束后你都需要输出换行符,**包括最后一行**。 checker 将在题目最后给出。 **「数据范围与约定」** **本题采用捆绑测试。** - Subtask #0(0 points):是样例。 - Subtask #1(15 points):$n\leq 3\times 10^3$,$m=2$。 - Subtask #2(15 points):$b_i>b_{i+1}\ (1\leq i