#P15699. [2026作业]分组洗牌

[2026作业]分组洗牌

题目描述

有一副包含 n 张牌的牌堆,每张牌编号为 1n,每个编号恰好出现一次。当前牌堆不一定有序,你需要通过若干次操作将其变成从上到下依次为 1, 2, ..., n 的有序牌堆。

一次操作如下:

选择一个整数 k,满足 2 <= k <= n,并将当前牌堆从上到下划分成 k 个非空连续段:

D_1, D_2, ..., D_k

其中 D_1 是牌堆最上方的一段,D_2 紧接其后,依此类推。然后将这些段的顺序整体反转,变为:

D_k, D_{k-1}, ..., D_1

每一段内部的牌序保持不变。

请输出一个不超过 120 次操作的方案,将牌堆排序。可以证明,在本题限制下总是存在这样的方案。你不需要最小化操作次数。

输入格式

第一行包含一个整数 n,表示牌的数量。

第二行包含 n 个整数 c_1, c_2, ..., c_n,表示当前牌堆从上到下的编号。

保证 c1n 的一个排列。

输出格式

第一行输出一个整数 q,表示你执行的操作次数,要求 0 <= q <= 120

接下来输出 q 行,每行描述一次操作。

一次操作的格式为:先输出整数 k,表示划分出的连续段数量;然后输出 k 个正整数,分别表示这些段的长度:

k |D_1| |D_2| ... |D_k|

必须满足:

  • 2 <= k <= n
  • |D_i| >= 1
  • |D_1| + |D_2| + ... + |D_k| = n

操作按输出顺序依次执行后,牌堆必须变为 1, 2, ..., n

数据范围

  • 1 <= n <= 20000

样例

样例 1

4
3 1 2 4
2
3 1 2 1
2 1 3

样例 2

6
6 5 4 3 2 1
1
6 1 1 1 1 1 1

样例 3

1
1
0