Guest User

Untitled

a guest
Jul 27th, 2016
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.83 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <stack>
  4. #include <vector>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. #define pb push_back
  9. #define mp make_pair
  10.  
  11. typedef long long ll;
  12. typedef long double ld;
  13. #define sz(v) (int)v.size()
  14.  
  15. ll INF = 1ll << 50;
  16. const int N = 1000002;
  17.  
  18. int t,n;
  19. ll a,b,c,x[N],dp[N],A[N];
  20. ll k1[N],b1[N];
  21.  
  22. /////////////////////// convex hull trick: begin
  23. struct line{
  24.     ll k,b;
  25.     ll xs;
  26.     line(ll k1, ll b1){
  27.         k = k1;
  28.         b = b1;
  29.         xs = -INF;
  30.     }
  31. };
  32. struct chull{
  33.     vector <line> v;
  34.  
  35.     void add(ll k, ll b){
  36.         line L(k,b);
  37.         while(!v.empty()){
  38.             line R = v.back();
  39.             ll x = ((R.b - L.b) + (L.k - R.k) - 1)/(L.k - R.k);
  40.             if(x <= R.xs) v.pop_back();
  41.             else {L.xs = x; break;}
  42.         }
  43.         v.push_back(L);
  44.     }
  45.     ll get(ll x){
  46.         int B = 0, E = sz(v)-1;
  47.         while(B!=E){
  48.             int M = (B+E+1)/2;
  49.             if(v[M].xs > x) E = M-1;
  50.             else B = M;
  51.         }
  52.         return x*v[B].k + v[B].b;
  53.     }
  54. };
  55. /////////////////////// convex hull trick: end
  56.  
  57. int main(){
  58.     scanf("%d", &t);
  59.     while(t){
  60.         t--;
  61.         scanf("%d", &n);
  62.         scanf("%lld%lld%lld", &a, &b, &c);
  63.         chull st;
  64.         for(int i=1;i<=n;i++){
  65.             scanf("%lld", &x[i]);
  66.             A[i] = A[i-1] + x[i];
  67.             k1[i] = -2*a*A[i];
  68.         }
  69.         dp[1] = a*x[1]*x[1] + b*x[1] + c;
  70.         b1[1] = dp[1] + a*A[1]*A[1] - b*A[1];
  71.         st.add(k1[1], b1[1]);
  72.         for(int i=2;i<=n;i++){
  73.             dp[i] = a*A[i]*A[i] + b*A[i] + c + st.get(A[i]);
  74.             dp[i] = max(dp[i],a*A[i]*A[i] + b*A[i] + c);
  75.             b1[i] = dp[i] + a*A[i]*A[i] - b*A[i];
  76.             st.add(k1[i], b1[i]);
  77.         }
  78.         printf("%lld\n", dp[n]);
  79.     }
  80.     return 0;
  81. }
Add Comment
Please, Sign In to add comment