题目描述
满二叉树由若干个节点组成。每个节点要么有两个子节点(左子节点和右子节点),要么没有任何子节点(此时称为叶子节点)。如果节点 $v$ 是节点 $u$ 的子节点,则称 $u$ 为 $v$ 的父节点。树的根节点是没有父节点的节点。在图中,根节点通常位于树的顶部。例如,下图展示了一棵拥有 15 个节点和 8 个叶子节点的满二叉树。
二叉树的子树是指任意节点及其所有后代(即子节点、子节点的子节点等)。如果两个子树没有任何公共节点,则称它们为不相交的。节点的深度定义为从根节点到该节点的路径上的节点数(不包括根节点)。例如,上图中的树,其叶子节点分别位于深度 3, 3, 3, 3, 2, 4, 4, 3。注意,已知各叶子节点的深度,我们可以唯一地还原出树的形状。
Bajtazar 是一名从事数据压缩的计算机科学家。他最近致力于使用二进制前缀码进行压缩,这种编码可以用满二叉树来表示。如果使用某种前缀码进行压缩,则描述该编码的树也必须包含在压缩文件中,因此描述越小越好。
Bajtazar 设计了一种压缩满二叉树的方法。他选择一定数量的互不相交的子树,其中每棵子树的叶子节点要么位于同一深度,要么位于相差为 1 的两个深度,并将这些子树替换为叶子节点。Bajtazar 以使得最终树的节点数最少的方式压缩树。例如,对上述树进行压缩后,得到了一棵只有 5 个节点的树:
从前缀码的效率角度来看,二叉树的具体形状并不重要,重要的是叶子节点在树中的深度。因此,如果两棵树具有相同的叶子深度多重集(即包含重复元素的集合),我们称这两棵树是等价的。例如,下面的满二叉树与之前的树具有相同的叶子深度:
压缩后得到了一棵只有 3 个节点的树:
Bajtazar 拥有一棵描述某种前缀码的满二叉树 $T$。他现在想构造一棵与之等价的树 $T'$,使得压缩 $T'$ 后得到的节点数最少。
输入格式
第一行包含一个整数 $n$ ($1 \le n$),表示满二叉树 $T$ 中的叶子节点数。 第二行包含 $n$ 个非负整数 $l_1, \dots, l_n$,由空格分隔,表示树中各叶子节点的深度(按从左到右的顺序)。
输出格式
你的程序应输出两行。第一行应包含一个整数,表示从与 $T$ 等价的某个满二叉树 $T'$ 压缩后得到的最小节点数。第二行应输出树 $T'$ 的叶子节点深度序列,按从左到右的顺序排列。如果存在多个正确答案,输出其中任意一个即可。
样例
样例输入 1
8 3 3 3 3 2 4 4 3
样例输出 1
3 2 3 3 3 3 3 4 4
子任务
测试集分为以下子任务。每个子任务的测试由一个或多个独立的测试组组成。
如果程序在第一行输出了正确结果,但在第二行输出了错误结果,则该测试点将获得 50% 的分数。但要求第二行必须输出输入中的叶子节点深度(顺序不限)。
| 子任务 | 条件 | 分数 |
|---|---|---|
| 1 | $n \le 20$ | 20 |
| 2 | $n \le 2000$ | 60 |
| 3 | $n \le 500\,000$ | 20 |