记录编号 592647 评测结果 AAAAAAAAAA
题目名称 [APIO2010]特别行动队 最终得分 100
用户昵称 Gravatarqyd 是否通过 通过
代码语言 C++ 运行时间 1.163 s
提交时间 2024-07-26 21:06:41 内存使用 14.74 MiB
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. const int maxn=1000010;
  5. int n,a,b,c;
  6. ll s[maxn],dp[maxn];
  7. ll head,tail,q[maxn];
  8. ll t(int i){return dp[i]-a*s[i]*s[i]-b*s[i]-c;}//intercept
  9. ll k(int i){return 2*a*s[i];}//slope
  10. ll x(int i){return s[i];}//coordinate-x
  11. ll y(int i){return dp[i]+a*s[i]*s[i]-b*s[i];}//coodinate-y
  12. double slope(int i,int j){return 1.0*(y(j)-y(i))/(x(j)-x(i));}
  13. //to calculate the slope between Pi and Pj
  14. int main()
  15. {
  16. freopen("special.in","r",stdin);
  17. freopen("special.out","w",stdout);
  18. cin>>n>>a>>b>>c;
  19. s[0]=0;dp[0]=0;q[0]=0;
  20. for(int i=1;i<=n;i++)
  21. {cin>>s[i];s[i]+=s[i-1];}
  22. head=0,tail=0;
  23. for(int i=1;i<=n;i++)
  24. {
  25. while(head<tail&&slope(q[head],q[head+1])>k(i))head++;
  26. dp[i]=y(q[head])-k(i)*x(q[head])+a*s[i]*s[i]+b*s[i]+c;
  27. while(head<tail&&slope(q[tail-1],q[tail])<slope(q[tail-1],i))tail--;
  28. q[++tail]=i;
  29. }
  30. cout<<dp[n]<<endl;
  31. return 0;
  32. }