斜率优化还是挺板子的: 考虑 两个变量 j,k ,且 F( j ) >F( k ) ,化简得到一个斜率的市子。。 slope( i ,j )
然后用单调队列维护
#include <iostream>
#include <cstring>
#include <queue>
using namespace std ;
const int N=1e6+4;
#define int long long
int n,A,B,C;
int s[N],f[N];
int q[N],hh,tt;
double slope(int i,int j){
return (f[i]-f[j]+A*(s[i]*s[i]-s[j]*s[j])-B*(s[i]-s[j]))/
double(2*A*(s[i]-s[j]));
}
void solve(){
int i;
hh=tt=1;
for(i=1;i<=n;i++){
while(hh<tt&&slope(q[hh],q[hh+1])<s[i])
hh++;
int x=s[i]-s[q[hh]];
f[i]=f[q[hh]]+A*x*x+B*x+C;
while(hh<tt&&slope(q[tt-1],q[tt])>slope(q[tt],i))
tt--;
q[++tt]=i;
}
cout<<f[n];
}
signed main(){
int x;
cin>>n>>A>>B>>C;
for(int i=1;i<=n;i++)cin>>x,s[i]=s[i-1]+x;
solve();
}
浙公网安备 33010602011771号