题目描述:
雾。
题目分析:
f[i]=f[j]+a*(sum[i]-sum[j-1])^2+b*(sum[i]-sum[j-1])+c
2*a*sum[i]*sum[j-1]+f[i]=f[j]+a*sum[j-1]^2-b*sum[j-1]+(a*sum[i]^2+b*sum[i]+c)
题目链接:
COGS 2129
BZOJ 1911
Luogu 3628
Ac 代码:
#include <cstdio>
#include <iostream>
#define ll long long
const int maxm=1e6+100;
ll dp[maxm],sum[maxm];
ll a,b,c;
int dl[maxm],n;
double slop(int k,int j)
{
return double(((dp[j]+a*sum[j]*sum[j]-b*sum[j])-(dp[k]+a*sum[k]*sum[k]-b*sum[k]))/double(sum[j]-sum[k]));
}
int main()
{
//freopen("special.in","r",stdin);
//freopen("special.out","w",stdout);
scanf("%d%lld%lld%lld",&n,&a,&b,&c);
for(int i=1;i<=n;i++)
{
scanf("%lld",&sum[i]);
sum[i]+=sum[i-1];
}
int l=1,r=1;
for(int i=1;i<=n;i++)
{
while(l<r&&slop(dl[l],dl[l+1])>2*a*sum[i]) l++;
int j=dl[l];
dp[i]=dp[j]+a*(sum[i]-sum[j])*(sum[i]-sum[j])+b*(sum[i]-sum[j])+c;
while(l<r&&slop(dl[r-1],dl[r])<slop(dl[r],i)) r--;
dl[++r]=i;
}
printf("%lld",dp[n]);
return 0;
}