#P1033. Defragment

Defragment

描述

您正在参与开发一个“新一代”操作系统和NG文件系统。在这个文件系统中,所有磁盘空间被划分为 $N$ 个相同大小的簇,以整数从 1 到 $N$ 编号。每个文件占用一个或多个簇,分布在磁盘的任意区域。未被文件占用的所有簇被视为可用空间。如果一个文件的所有簇都位于自然顺序的连续磁盘簇中,则可以最快速度从磁盘读取该文件。

以恒定速度旋转的磁盘意味着访问其簇所需的时间不同。因此,读取靠近磁盘开头的簇的速度比读取靠近磁盘末尾的簇的速度更快。因此,所有文件在访问频率递减的顺序中以整数从 1 到 $K$ 编号。在文件在磁盘上的最佳放置下,文件编号1将占用簇 1, 2, ..., $S_1$,文件编号2将占用簇 $S_1+1, S_1+2, ..., S_1+S_2$,依此类推(这里 $S_i$ 是第 $i$ 个文件占用的簇数量)。

为了将文件在磁盘上以最佳方式放置,将执行簇移动操作。一次簇移动操作包括从磁盘读取一个被占用的簇到内存并将其内容写入某个可用的簇。之后,将第一个簇标记为空闲,第二个簇标记为占用。

您的目标是通过执行尽可能少的簇移动操作,将文件在磁盘上以最佳方式放置。

输入

输入文件的第一行包含两个整数 $N$ 和 $K$,以空格分隔 ($1 \leq K < N \leq 10000$)。接着 $K$ 行描述每个文件。第 $i$ 个文件的描述以整数 $S_i$ 开头,表示该文件占用的簇数量($1 \leq S_i < N$)。然后是 $S_i$ 个整数,按自然顺序表示该文件在磁盘上的簇号。

输入文件中的所有簇号都是不同的,并且磁盘上始终至少有一个空闲簇。

输出

程序应将对输出文件进行的任何簇移动操作的序列写入,操作顺序应该是将数据移动的簇的起始簇号和目标簇号以单个空格隔开呈现。$P_j$ 表示要移动的簇号,$Q_j$ 表示要移动到的簇号。

执行的簇移动操作的数量应尽量小。如果磁盘上的文件已经以最佳方式放置,则输出应仅包含字符串“无须优化”。

20 3 4 2 3 11 12 1 7 3 18 5 10
2 1 3 2 11 3 12 4 18 6 10 8 5 20 7 5 20 7

来源

东北欧 1998