[R60E]折叠 - 代码源竞赛平台

时空限制

2S/512M

题目描述

apiadu 有一张纸条,他想对这张纸条进行折叠操作。

初始时,纸条的长度为 n+1n+1,上面共有 nn 条折痕,从左到右编号为 1∼n1 \sim n。折痕均匀分布在纸条上,具体来说,相邻两条折痕之间的距离为 11,第 11 条折痕距离纸条左侧边缘的距离也为 11,第 nn 条折痕距离纸条右侧边缘的距离也为 11,每条折痕要么朝里,要么朝外。

当折叠操作进行到任意时刻时,都可以保证折痕依旧均匀分布在纸条上,假设此时纸条的长度为 m+1m+1,上面有 mm 条折痕,则折痕的方向可以用一个只包含 00 和 11 的序列 b1,b2,…,bmb_1,b_2,\dots,b_m 来表示,对于 ii(1≤i≤m1 \le i \le m),如果 bi=0b_i=0,则第 ii 条折痕朝里,否则第 ii 条折痕朝外。

apiadu 想把通过折叠操作,把纸条的长度折成 11,他可以进行的折叠操作如下:

  • 假设现在纸条的长度为 m+1m+1,折痕方向的序列为 b1,b2,…,bmb_1,b_2,\dots,b_m,apiadu 可以选择一个正整数 xx 满足 1≤x≤m1 \le x \le m,并且对于所有 ii (1≤i≤min⁡(x−1,m−x)1 \le i \le \min(x-1,m-x)),满足 bx−i≠bx+ib_{x-i} \ne b_{x+i},他会将纸条沿第 xx 条折痕折叠,折叠后,纸条会按如下方式变化:
    • 如果 x−1≤m−xx-1 \le m-x,则折叠后纸条长度会变为 m−x+1m-x+1,上面有 m−xm-x 条均匀分布的折痕,纸条的折痕方向序列会变为 bx+1,bx+2,…,bmb_{x+1},b_{x+2},\dots,b_m。特别地,当 m=1m=1 且 x=1x=1 时,折叠后纸条长度变为 11,折痕数量变为 00。
    • 如果 x−1>m−xx-1 > m-x,则折叠后纸条长度会变为 xx,上面有 x−1x-1 条均匀分布的折痕,纸条的折痕方向序列会变为 1−b1,1−b2,…,1−bx−11-b_1,1-b_2,\dots,1-b_{x-1}。

请帮助可爱的 apiadu 求出最少需要进行多少次折叠操作,才能使纸条长度变为 11。

格式

输入格式

第一行包含一个整数 nn,表示初始时纸条长度为 n+1n+1,上面有 nn 条折痕。

第二行包含 nn 个整数 a1,a2,…,ana_1,a_2,\dots,a_n,表示初始时的折痕方向序列。

输出格式

输出一行一个整数,表示最少需要进行的操作次数。

样例

样例输入 #1

4
0 1 1 0

样例输出 #1

3

样例解释 #1

以下是一种可行的操作方案:

第 11 次操作:选择 x=2x=2,操作后折痕方向序列会变成 [1,0][1,0]。

第 22 次操作:选择 x=2x=2,操作后折痕方向序列会变成 [0][0]。

第 33 次操作:选择 x=1x=1,操作后纸条长度变为 11,折痕数量为 00。

可以证明不存在所需操作次数小于 33 的操作方案。

样例输入 #2

5
0 1 0 1 0

样例输出 #2

5

样例输入 #3

6
0 1 1 0 1 1

样例输出 #3

3

数据规模

注意:你只有通过了子任务的所有测试点,才能获得对应子任务的分数。

子任务编号 分数 n≤n \le
11 1010 88
22 2020 3030
33 2525 5050
44 4545 100100

对于 100%100\% 的数据,1≤n≤1001 \le n \le 100,0≤ai≤10 \le a_i \le 1。