题目描述
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 |