#P15699. [2026作业]分组洗牌
[2026作业]分组洗牌
题目描述
有一副包含 n 张牌的牌堆,每张牌编号为 1 到 n,每个编号恰好出现一次。当前牌堆不一定有序,你需要通过若干次操作将其变成从上到下依次为 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,表示当前牌堆从上到下的编号。
保证 c 是 1 到 n 的一个排列。
输出格式
第一行输出一个整数 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