题目描述
给定一个 1,2,…,n 的排列
a1,a2,…,an,
你需要对这个排列做不超过 104 次如下操作,使得
a=[1,2,…,n].
一次操作如下:
-
选择一个整数 1≤k≤n,然后将整个排列分成 k 个非空段 D1,D2,…,Dk,其中 D1 包含了 a 的前 ∣D1∣ 个元素,D2 包含了 a 的接下来 ∣D2∣ 个元素,以此类推。你需要保证
∣D1∣+∣D2∣+⋯+∣Dk∣=n.
-
对于所有编号 i 为奇数的段 Di,将 Di 反序。
-
令
a=DkDk−1⋯D1.
注意:104 次操作并不能获得满分,评分细则见“子任务”。
输入格式
第一行,一个正整数 n。
第二行,n 个正整数 a1,a2,…,an。
输出格式
第一行,一个非负整数 t,表示操作次数。
接下来 t 行,每行表示一次操作。第一个数 k 表示段数,接下来 k 个数表示
∣D1∣,∣D2∣,…,∣Dk∣.
样例输入 #1
7
2 6 4 3 1 5 7
样例输出 #1
4
4 2 3 1 1
3 2 3 2
3 1 4 2
4 1 2 2 2
Special Judge
下发文件中有 chk.cpp,将其与 testlib.h 置于同一目录下并编译,即可得到可执行文件 chk。
在 Linux 下,使用如下命令检查你的答案是否正确:
./chk animus.in animus.out animus.out
子任务与评分
本题共有两个子任务,每个子任务 50 分,并且有五个评分参数
q1>q2>q3>q4>q5.
对于子任务中的每个测试点,设你的操作次数是 t,设
s=i=1∑5[t≤qi],
得分如下表所示:
| s |
0 |
1 |
2 |
3 |
4 |
5 |
| 得分 |
0 |
7 |
16 |
32 |
45 |
50 |
一个子任务的得分是其中所有测试点得分的最小值,整道题的得分是两个子任务的得分之和。
| 子任务 |
n |
q1 |
q2 |
q3 |
q4 |
q5 |
| 1 |
29 |
104 |
2000 |
1200 |
510 |
200 |
| 2 |
216 |
1000 |
500 |
190 |
@下发文件