Matrix_code

dp - Convex Hull - Deque

Sep 27th, 2017 (edited)
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.58 KB | None | 0 0
  1. /********************** CONVEX HULL TRICK ***********************************
  2. 1. Not normal Slope.
  3. 2. Using deque
  4. 3. Problem: https://vjudge.net/problem/HDU-3045
  5. ****************************************************************************/
  6. #include<bits/stdc++.h>
  7. using namespace std;
  8. #define LL                      long long
  9.  
  10. const int N = 400006;
  11. int n,T;
  12. LL dp[N];
  13. LL sum[N];
  14. LL a[N];
  15. LL calc(int k){ return dp[k] - sum[k] + a[k+1]*k;}
  16. int main()
  17. {
  18.       while(scanf("%d %d",&n,&T)==2){
  19.             for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
  20.             sort(a+1,a+n+1);
  21.             for(int i=1;i<=n;i++) sum[i] = a[i] + sum[i-1] ;
  22.             dp[0]=0;
  23.             sum[0]=0;
  24.  
  25.  
  26.             deque<int> q;
  27.             q.push_back(0);
  28.             for(int i=T; i<= n;i ++) {
  29.                   while(q.size() > 1 ) {
  30.                         int k = q[0] , j = q[1];
  31.                         if( calc(j) - calc(k) <= i * (a[j+1] - a[k+1])) q.pop_front();
  32.                         else break;
  33.                   }
  34.                   int j = q.front();
  35.                   dp[i] = dp[j] + sum[i] - sum[j] - a[j+1]*(i-j);
  36.                   j = i-T+1;
  37.                   if(j < T) continue;
  38.                   while(q.size()>1) {
  39.                         int k = q[q.size()-1],  l = q[q.size()-2];
  40.                         if( (calc(j) - calc(k)) * (a[k+1] - a[l+1]) <= (calc(k) - calc(l)) * (a[j+1] - a[k+1])  ) q.pop_back();
  41.                         else break;
  42.                   }
  43.                   q.push_back(j);
  44.             }
  45.             cout << dp[n] << endl;
  46.       }
  47.       return 0;
  48. }
Add Comment
Please, Sign In to add comment