50pts求助,悬2关
查看原帖
50pts求助,悬2关
782941
_O_v_O_楼主2024/1/26 11:50

rt

#include<bits/stdc++.h>
using namespace std;
#define int long long

const int N=5e4+5;
int n,a,b,c;
int x[N],dp[N],s[N];
int dq[N],l,r;

double xie(int i,int j){
	return 1.0*((dp[i]+a*s[i]*s[i]-b*s[i])-(dp[j]+a*s[j]*s[j]-b*s[j]))/(s[i]-s[j]);
}

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(nullptr);
	cin>>n>>a>>b>>c;
	for(int i=1;i<=n;i++){
		cin>>x[i];
		s[i]=s[i-1]+x[i];
	}
	l=r=1;
	for(int i=1;i<=n;i++){
		while(l<r&&xie(dq[l],dq[l+1])>2*a*s[i]){
			l++;
		}
		dp[i]=dp[dq[l]]+a*(s[i]-s[dq[l]])*(s[i]-s[dq[l]])+b*(s[i]-s[dq[l]])+c;
		while(l<r&&xie(dq[r-1],dq[r])<xie(dq[r],i)){
			r--;
		}
		dq[++r]=i;
	}
	cout<<dp[n];
	return 0;
}
2024/1/26 11:50
加载中...