#P7065. [NWRRC 2014] Fragmentation

[NWRRC 2014] Fragmentation

Description

Felix 正在他的车库里进行一个创业项目。他已经为他的项目找到了一个很棒的名字:SuperFastZilla。目前他还不确定 SuperFastZilla 应该做什么,但他非常确定它应该做得很快,超级快。

有一次他注意到 SuperFastZilla 的运行速度太慢,尽管它使用了快速算法。Felix 认为问题可能是由存储碎片引起的。

SuperFastZilla 使用的存储由 nn 个内存块组成。SuperFastZilla 在这个存储上执行一些操作。每个块只在一个操作中使用,第 ii 个块在第 aia_{i} 个操作中使用。

Felix 想按它们使用的操作索引对这些块进行排序。为了加快速度,Felix 想将存储分成最少数量的连续块段,然后重新排列这些段以获得排序后的块数组。重新排列后,块的操作索引顺序必须是非递减的。

帮助 Felix 找到一种分割存储的方法,以最小化段的数量。

例如,如果 a=[2,3,1,1,2,2,1]a = [2 , 3 , 1 , 1 , 2 , 2 , 1],它可以分成三部分:[2,3],[1,1,2,2][2 , 3], [1 , 1 , 2 , 2][1][1]。这些部分可以重新排列以形成排序后的数组:[1],[1,1,2,2],[2,3][1], [1 , 1 , 2 , 2], [2 , 3]

Input Format

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

Output Format

输出文件的第一行必须包含一个整数 mm — 最小的段数。

下一行必须包含 mm 个整数,表示从左到右的段的长度。

7
2 3 1 1 2 2 1

3
2 4 1

Hint

时间限制:2 秒,内存限制:256 MB。

题面翻译由 ChatGPT-4o 提供。