题目描述
Yoimiya 和云浅在放烟花。在第 0 秒时,烟花位于坐标 (0,0) 处。一个烟花可能走到的位置和它的材料有关。
具体地,烟花的材料可以用一个 01 序列 s 表示,烟花将会在空中燃烧 ∣s∣ 秒。对每个 i=1,2,⋯,∣s∣,设烟花现在的位置为 (x,y):
- 若 si=0,则烟花在下一秒可能会飞到 (x,y),(x+1,y),(x+1,y+1) 中的一个点。
- 若 si=1,则烟花在下一秒可能会飞到 (x,y),(x−1,y),(x−1,y−1) 中的一个点。
定义 f(s) 为材料为 s 的烟花最终可能会飞到的点的数目。
Yoimiya 现在有一个长为 n 的 01 序列 a,她想用这个序列制造恰好 k 个烟花。具体地,她需要把这个序列划分为互不相交的 k 个区间,且每个 ai 都至少会被划分到一个区间内;由于燃放烟花会带来污染,这个划分方案的污染度就定义为每一段的 f 值之和。你需要帮她找到污染度最小的划分方案。
形式化地,你需要找到 k 个区间 [l1,r1],⋯,[lk,rk] 满足:
- l1=1,rk=n
- ∀1≤i≤k,li≤ri
- ∀1≤i≤k−1,ri+1=li+1
要求最小化 ∑i=1kf(a[li⋯ri]),其中 a[p⋯q] 表示序列 (ap,ap+1,⋯,aq)。
输入格式
第一行两个正整数 n,k。
接下来一行 n 个数 a1,⋯,an 表示序列 a,保证 ai∈{0,1}。
输出格式
输出一行一个正整数表示答案。
样例 1 输入
6 3
0 0 1 0 1 1
样例 1 输出
19
样例 1 解释
最优方案是将 a 划分为 a1=(0,0),a2=(1,0),a3=(1,1),可以验证:
- f(a1)=f(a3)=6
- f(a2)=7
其中以 a2 为材料的烟花能够到达的点是:
- (−1,−1),(−1,0),(0,−1),(0,0),(0,1),(1,0),(1,1)
以 a1 为材料的烟花能够到达的点是:(0,0),(1,0),(1,1),(2,0),(2,1),(2,2)。
测试点约束
对于 100% 的数据,1≤k≤n≤2×105,ai∈{0,1}。各子任务的约束如下表所示:
子任务编号 |
n |
k |
特殊性质 |
依赖子任务 |
分值 |
Subtask #1 |
≤5 |
无 |
无 |
6 |
Subtask #2 |
≤20 |
1 |
9 |
Subtask #3 |
≤200 |
1,2 |
10 |
Subtask #4 |
≤2000 |
1,2,3 |
17 |
Subtask #5 |
≤105 |
≤50 |
ai=0 |
无 |
7 |
Subtask #6 |
无 |
1,2,5 |
11 |
Subtask #7 |
≤105 |
ai=0 |
5 |
13 |
Subtask #8 |
无 |
1,2,3,4,5,6,7 |
17 |
Subtask #9 |
≤2×105 |
1,2,3,4,5,6,7,8 |
10 |