斜率优化求助,玄关

P3628 [APIO2010] 特别行动队

@[cy1999_de_dog](/user/442801) ```cpp #include<bits/stdc++.h> #define int long long using namespace std; const int N=1e6+5; long long dp[N],sum[N]; int q[N]; long long a,b,c; long long x(int i) { return sum[i]; } long long y(int i) { return dp[i]+a*sum[i]*sum[i]-b*sum[i]; } double xl(int i,int j) { return 1.0*(y(i)-y(j))/((x(i)-x(j))); } signed main() { int n; cin>>n>>a>>b>>c; for(int i=1;i<=n;i++) { long long d; cin>>d; sum[i]=sum[i-1]+d; } int l=0,r=0; for(int i=1;i<=n;i++) { long long k=2*a*sum[i]; // int j1=q[l],j2=q[l+1]; // while(l<r&&(xl(j1,j2)>k)) l++; while(r - l + 1 >= 2 && xl(q[l], q[l + 1]) > k) { l++; } int j=q[l]; dp[i]=dp[j]+a*(sum[i]-sum[j])*(sum[i]-sum[j])+b*(sum[i]-sum[j])+c; while(r - l + 1 >= 2 &&xl(q[r - 1], q[r])<=xl(q[r],i)) { r--; } q[++r]=i; } cout<<dp[n]<<endl; return 0; } ```
by cmaths @ 2023-11-13 21:40:25


%%%,谢谢谢佬
by cy1999_de_dog @ 2023-11-13 21:43:44


|