#include<bits/stdc++.h>
using namespace std;
int read() {
int x = 0,f = 0;char ch = getchar();
while(!isdigit(ch)) {if(ch == '-')f = 1;ch = getchar();}
while(isdigit(ch)) {x = x * 10 + ch - '0';ch = getchar();}
return f ? -x : x;
}
#define ll long long
const ll inf = 1e18;
const int N = 1e5 + 100;
ll f[N],g[N],q[N],s[N];
int n,m;
#define Y(a) (f[a]+s[a]*s[a]-2*s[a])
#define X(a) (s[a])
long double K(int a,int b) {
return (long double)(Y(b) - Y(a)) / (X(b) - X(a));
}
void check(ll mid) {
f[0] = 0;int l = 1,r = 1;q[1] = 0;
for(int i = 1;i <= n;i++) {
while(l < r && K(q[l],q[l + 1]) <= 2 * s[i]) l++;
f[i] = f[q[l]] + (s[i] - s[q[l]] + 1) * (s[i] - s[q[l]] + 1) + mid;
g[i] = g[q[l]] + 1;
while(l < r && K(q[r - 1],q[r]) >= K(q[r - 1],i)) r--;
q[++r] = i;
}
}
int main() {
n = read();m = read();
for(int i = 1;i <= n;i++) s[i] = s[i - 1] + read();
ll l = 0,r = inf,ans = 0;
while(l <= r) {
ll mid = l + r >> 1;check(mid);
if(g[n] <= m) ans = mid , r = mid - 1;
else l = mid + 1;
}
check(ans);
printf("%lld\n",f[n] - g[n] * ans);
return 0;
}
斜率优化出现精度问题了,好像?