#1295. 汰换合同

内存限制:512 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统 评测方式:文本比较
上传者: Leohh

题目描述

在CS:GO中,使用汰换合同可以将多个低品质的武器换成一个高品质的武器。现在Leohh的库存中共有 nn 个武器,从左到右摆成一列,第 ii 个武器的品质值为 aia_i 。对于第 ii 个和第 jj 个武器来说 (i<j)(i<j) ,若满足它们的品质值相同即 ai=aja_i=a_j ,则可以使用汰换合同,用武器 iijj 换回来一个品质值为 2ai2a_i 的武器,新武器放在武器 jj 原来的位置。

为了方便操作,每次汰换时,Leohh会先确定一个最小的品质值 bb 满足至少有两个武器的品质值等于 bb ,然后在所有品质值等于 bb 的武器中,挑最靠左的两个进行汰换。Leohh并不知道自己会血赚还是血亏,所以想问问你,如果不断地使用汰换合同直到不能汰换(即不存在两把品质值相同的武器),最终会剩下多少个武器,这些武器的品质值分别是什么?

输入格式

第一行一个整数 nn ,表示武器的数量

第二行 nn 个整数 a1ana_1\cdots a_n ,表示武器的品质值

输出格式

第一行一个整数 kk ,表示最终剩下武器的数量

第二行 kk 个整数,表示最终剩下武器的品质值

样例

样例输入

8 
1 4 2 4 3 2 5 1

样例输出

5
8 3 4 5 2

数据范围与提示

2n2×105,1ai1092\leq n\leq 2\times 10^5,1\leq a_i\leq 10^9

样例解释:[1,4,2,4,3,2,5,1][4,2,4,3,2,5,2][4,4,3,4,5,2][8,3,4,5,2][1, 4, 2, 4, 3, 2, 5, 1] \rightarrow [4, 2, 4, 3, 2, 5, 2] \rightarrow [4, 4, 3, 4, 5, 2] \rightarrow [8, 3, 4, 5, 2]