思路分析
我们的目标是最大化 ∑bi。由于 bi 的定义依赖于前缀 MEX,并且 bi 序列是非递减的(b1≤b2≤...≤bn),我们希望让 bi 的值尽可能早地、尽可能大地增长。
bi=MEX({a1,...,ai})。为了让 bi 的值变大,我们需要让前缀 {a1,...,ai} 尽可能地包含从 0 开始的连续整数。
- 为了最大化 b1=MEX({a1}),我们应该选择 a1=0(如果数组 a 中有 0 的话)。这样 b1=1。如果选择其他数, b1=0。
- 为了最大化 b2=MEX({a1,a2}),在 a1=0 的基础上,我们应该选择 a2=1(如果数组 a 中有 1 的话)。这样 {a1,a2}={0,1},使得 b2=2。
- 以此类推,为了让 bi 达到最大可能值 i,我们需要让前缀 {a1,...,ai} 恰好是 {0,1,...,i−1}。
题目内容
小美有一个长度为 n 的数组 a 。你可以将 a 任意重排。定义一个长度为 n 的数组 b,其中 bi=MEX(a1,a2,...,ai)。你需要最大化数组 b 中的元素之和。
你需要输出最大的元素和,以及一个可能的 a 的重排方案。
【名词解释】
MEX:整数数组的 MEX 定义为没有出现在数组中的最小非负整数。例如 MEX{1,2,3}=0、MEX{0,2,5}=1 。
输入描述
第一行输入一个整数 n(1≦n≦2⋅105) ,表示数组 a 的长度
第二行输入 n 个整数 a1,a2,...,an(0≦ai≦109) ,表示数组 a 的元素。
输出描述
第一行输出一个整数,表示 b 的元素和。
第二行输出 n 个整数,表示重排后的 a 。
如果存在多个解决方案,您可以输出任意一个,系统会自动判定是否正确。注意,自测运行功能可能因此返回错误结果,请自行检查等案正确性。
样例1
输入
3
1 0 1
输出
5
0 1 1
说明
将 a 重排为 {0,1,1} 后,数组 b 为 {1,2,2} ,元素和为 5 。
可以证明不存在一个重排使得数组 b 的元素和大于 5 。
样例2
输入
6
0 1 2 3 4 5
输出
21
0 1 2 3 4 5