rt,洛谷 AC,UOJ WA on #33,调不出来了,求调
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k,x,s[100005],f[100005],g[100005],q[100005],fa[205][100005],ans[205];
double calc(int x,int y)
{
if(s[x]==s[y])return -1e9;
return 1.0*((g[y]-s[y]*s[y])-(g[x]-s[x]*s[x]))/(-s[y]-(-s[x]));
}
signed main()
{
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;i++)scanf("%lld",&x),s[i]=s[i-1]+x;
for(int j=1;j<=k;j++)
{
for(int i=1;i<=n;i++)g[i]=f[i];
int head=1,tail=0;
for(int i=1;i<=n;i++)
{
while(head<tail&&calc(q[head],q[head]+1)<(double)s[i])head++;
f[i]=g[q[head]]+(s[q[head]])*(s[i]-s[q[head]]);
fa[j][i]=q[head];
while(head<tail&&calc(q[tail-1],q[tail])>calc(q[tail],i))tail--;
q[++tail]=i;
}
}
printf("%lld\n",f[n]);
int now=n;
for(int i=k;i>=1;i--)ans[i]=now=fa[i][now];
for(int i=1;i<=k;i++)printf("%lld ",ans[i]);
return 0;
}