该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
Background
Day 1
MrPython:“能做出来这题的是 zak”
Day 2
MrPython:“%%% zak”
Description
对于一个长为 n 的序列 A,定义一次操作 CheckAndSwap(i,j)(1≤i,j≤n) 为:
- 检查是否有 Ai>Aj;
- 若是,交换 Ai 和 Aj。
现在,你有一个机器,可以在一个序列上对若干对不同位置,并行地进行 CheckAndSwap 操作。
形式地说,你每次可以指定 m 个有序二元对 (i1,j1),(i2,j2),…,(im,jm),且这 2m 个数互不相同,机器会同时进行 m 次 CheckAndSwap 操作,第 x 次操作为 CheckAndSwap(ix,jx),上述过程用时 1 个单位时间。
你希望用尽量少的时间对长为 N 的序列排序。
Constraints and Subtasks
对于全部测试点,满足:
- 1≤N≤100
每个子任务的输入如下:
| Subtask |
N |
t1 |
t2 |
t3 |
分数 |
| 1 |
8 |
28 |
9 |
6 |
10 |
| 2 |
13 |
78 |
14 |
10 |
10 |
| 3 |
16 |
120 |
17 |
10 |
| 4 |
32 |
496 |
33 |
15 |
10 |
| 5 |
53 |
1378 |
54 |
21 |
10 |
| 6 |
64 |
2016 |
65 |
10 |
| 7 |
73 |
2628 |
74 |
28 |
10 |
| 8 |
82 |
3321 |
83 |
10 |
| 9 |
91 |
4095 |
92 |
29 |
10 |
| 10 |
100 |
4950 |
101 |
30 |
10 |
对于每个子任务,如果你的代码不正确,则获得 0 分。
否则,如果代码耗时 t 单位时间,设这个子任务的评分参数为 t1,t2,t3,那么你的分数为
$$f(t)=
\begin{cases}
0 & t>t_1\\
1+\frac{2}{t-t_2} & t_1\ge t>t_2\\
3+\frac{7(t_2-t+1)}{t_2-t_3} & t_2\ge t>t_3\\
10 & t_3\ge t
\end{cases}\\
\text{score}(t)=\left\lfloor f(t)+0.5\right\rfloor
$$
即 f(t) 四舍五入后的结果。
输入内容从标准输入中给出,格式如下:
$
\boxed{\begin{aligned}
& n {\quad} t_1 {\quad} t_2 {\quad} t_3
\end{aligned}}
$
Output
首先输出一行一个非负整数 t,表示你排序需要的时间。
接下来,若 t=0,你需要按顺序输出 t 组操作序列,对于每一组操作序列:
-
先输出 m,表示你要同时对 m 对下标进行操作。
-
接下来 m 行,每行两个正整数 ix,jx,表示对下标 ix,jx 做操作。
Samples
4
3
2
1 2
3 4
2
1 3
2 4
1
2 3
以序列 3 1 4 2 为例:
- 第 1 个单位时间内,对 (1,2),(3,4) 操作,序列变为
1 3 2 4;
- 第 2 个单位时间内,对 (1,3),(2,4) 操作,序列没有变化;
- 第 3 个单位时间内,对 (2,3) 操作,序列变为
1 2 3 4。
可以验证,对于任何长为 4 的序列,可以经上述操作后排序。
Note
判定答案是 co-NP 的,因此 SPJ 只对部分序列检查你的答案是否能将其排序。
因此,也不保证赛时不会进行数据加强。