斜率优化第n发
zjoi被虐了啊
#include<bits/stdc++.h>
using namespace std;
long long sum[3002],f[3002][3002];
int n,m,head,tail,a;
int q[3002];
double GET(int i,int x,int y){
return((double)(f[i][x]+sum[x]*sum[x]-f[i][y]-sum[y]*sum[y]))/((double)(sum[x]-sum[y]));
}
main(){
cin>>n>>m;
for (int i=1;i<=n;i++){
cin>>a;
sum[i]=sum[i-1]+a;
}
memset(f,63,sizeof(f));
f[0][0]=0;
for(int i=1;i<=m;i++){
head=tail=1;
for(int j=1;j<=n;j++){
while(head<tail&&GET(i-1,q[head+1],q[head])<(double)(sum[j]<<1)){
head++;
}
f[i][j]=(sum[j]-sum[q[head]])*(sum[j]-sum[q[head]])+f[i-1][q[head]];
while(head<tail&&GET(i-1,q[tail],q[tail-1])>GET(i-1,j,q[tail])){
tail--;
}
q[++tail]=j;
}
}
cout<<f[m][n]*m-sum[n]*sum[n]<<endl;
return 0;
}