斜率优化还是挺板子的:  考虑 两个变量 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();
 }

 

posted on 2023-03-04 17:47  towboat  阅读(17)  评论(0)    收藏  举报