#include<bits/stdc++.h>
using namespace std;
int n,s,t[1000010],c[1000010];
int f[1000010],q[1000010],head,tail;
double k(int i,int j)
{ return (double)(f[i]-f[j])/(c[i]-c[j]); }
int main()
{
scanf("%d%d",&n,&s);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&t[i],&c[i]);
t[i]+=t[i-1];
c[i]+=c[i-1];
}
q[tail]=0;
for(int i=1;i<=n;i++)
{
while(head<tail&&k(q[head],q[head+1])<=s+t[i]) head++;
f[i]=t[i]*c[i]+s*c[n]+f[q[head]]-c[q[head]]*(s+t[i]);
while(head<tail&&k(q[tail-1],q[tail])>=k(q[tail-1],i)) tail--;
q[++tail]=i;
}
printf("%d",f[n]);
return 0;
}
/*
5
1
1 3
3 2
4 3
2 3
1 4
*/
#include<bits/stdc++.h>
using namespace std;
int n,m,l[100010],sum[100010];
int f[3010][3010];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&l[i]);
sum[i]=sum[i-1]+l[i];
}
memset(f,0x3f3f3f,sizeof f);
f[0][0]=0;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
for(int k=0;k<j;k++)
f[i][j]=min(f[i][j],f[i-1][k]+(sum[j]-sum[k])*(sum[j]-sum[k]));
printf("%d",m*f[m][n]-sum[n]*sum[n]);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,ans,l[100010],sum[100010];
int f[3010],g[3010],q[3010];
double slope(int i,int j)
{ return (double)(f[j]-f[i]+sum[j]*sum[j]-sum[i]*sum[i])/(sum[j]-sum[i]); }
void merge(int x)
{
int l=0,r=0;
q[0]=0;
for(int i=1;i<=n;i++)
{
while(l<r&&slope(q[l],q[l+1])<2.0*sum[i]) l++;
f[i]=f[q[l]]+x+(sum[i]-sum[q[l]])*(sum[i]-sum[q[l]]);
g[i]=g[q[l]]+1;
while(l<r&&slope(q[r-1],q[r])>slope(q[r],i)) r--;
q[++r]=i;
}
}
signed main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&l[i]);
sum[i]=sum[i-1]+l[i];
}
int l=0,r=sum[n]*sum[n];
while(l<r)
{
int mid=l+r>>1;
merge(mid);
if(m<g[n]) l=mid+1;
else r=mid,ans=m*(f[n]-mid*m)-sum[n]*sum[n];
}
printf("%lld",ans);
return 0;
}
活动地址:CSDN21天学习挑战赛