#codefestival2017qualaf. [code_festival_2017_quala_f]Squeezing Slimes

[code_festival_2017_quala_f]Squeezing Slimes

题目描述

AA 个史莱姆排成一行。最开始,所有史莱姆的大小都是 11

Snuke 可以重复进行以下操作:

  • 选择一个正偶数 MM。然后,从这些史莱姆中选择 MM 个连续的史莱姆,并按照以下方式将它们组成 M/2M/2 对:将左起第 11 和第 22 个史莱姆组成一对,第 33 和第 44 个组成一对,...... ,第 (M1)(M-1) 和第 MM 个组成一对。将每一对史莱姆合并为一个更大的史莱姆。合并后的史莱姆的大小等于合并前的各个史莱姆的大小之和。合并之前的 M/2M/2 个史莱姆对的顺序与合并之后的 M/2M/2 个史莱姆保持一致。

Snuke 希望达到恰好有 NN 个史莱姆的情况,并且从左边起第 ii 个(1iN1 ≤ i ≤ N)史莱姆的大小为 aia_i。请找出实现他的目标所需的最小操作次数。

注意:AA 不直接给出作为输入。假设 A=a1+a2+...+aNA = a_1 + a_2 + ... + a_N

约束条件

  • 1N1051 ≤ N ≤ 10^5
  • aia_i 是整数。
  • 1ai1091 ≤ a_i ≤ 10^9

输入

输入以以下格式从标准输入给出:

NN a1a_1 a2a_2 ...... aNa_N

输出

输出实现 Snuke 目标所需的最小操作次数。


示例输入1

2
3 3

示例输出1

2

一种实现 Snuke 目标的方法如下。这里,被选择的史莱姆用粗体标记。

  • (1, 1, 1, 1, 1, 1) → (1, 2, 2, 1)
  • (1, 2, 2, 1) → (3, 3)

示例输入2

4
2 1 2 2

示例输出2

2

一种实现 Snuke 目标的方法如下。

  • (1, 1, 1, 1, 1, 1, 1) → (2, 1, 1, 1, 1, 1)
  • (2, 1, 1, 1, 1, 1) → (2, 1, 2, 2)

示例输入3

1
1

示例输出3

0

示例输入4

10
3 1 4 1 5 9 2 6 5 3

示例输出4

10