P7065 [NWRRC 2014] Fragmentation

题目描述

Felix 正在他的车库里进行一个创业项目。他已经为他的项目找到了一个很棒的名字:SuperFastZilla。目前他还不确定 SuperFastZilla 应该做什么,但他非常确定它应该做得很快,超级快。 有一次他注意到 SuperFastZilla 的运行速度太慢,尽管它使用了快速算法。Felix 认为问题可能是由存储碎片引起的。 SuperFastZilla 使用的存储由 $n$ 个内存块组成。SuperFastZilla 在这个存储上执行一些操作。每个块只在一个操作中使用,第 $i$ 个块在第 $a_{i}$ 个操作中使用。 Felix 想按它们使用的操作索引对这些块进行排序。为了加快速度,Felix 想将存储分成最少数量的连续块段,然后重新排列这些段以获得排序后的块数组。重新排列后,块的操作索引顺序必须是非递减的。 帮助 Felix 找到一种分割存储的方法,以最小化段的数量。 例如,如果 $a = [2 , 3 , 1 , 1 , 2 , 2 , 1]$,它可以分成三部分:$[2 , 3], [1 , 1 , 2 , 2]$ 和 $[1]$。这些部分可以重新排列以形成排序后的数组:$[1], [1 , 1 , 2 , 2], [2 , 3]$。

输入格式

输入文件的第一行包含一个整数 $n (1 \le n \le 10^{5})$。下一行包含 $n$ 个整数 $a_{i} (1 \le a_{i} \le 10^{5})$。

输出格式

输出文件的第一行必须包含一个整数 $m$ — 最小的段数。 下一行必须包含 $m$ 个整数,表示从左到右的段的长度。

说明/提示

时间限制:2 秒,内存限制:256 MB。 题面翻译由 ChatGPT-4o 提供。