Advertisement
Guest User

Untitled

a guest
Nov 6th, 2014
430
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.12 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6.  
  7. const int MAXN = 100010;
  8. const int MAXK = 11;
  9.  
  10. ll dp[MAXK][MAXN];
  11. ll w[MAXN];
  12. ll s[MAXN];
  13. ll p[MAXN];
  14. int Q[MAXN];
  15.  
  16. ll cost(int i,int j){
  17.     return ((long long)j)*(s[i] - s[j+1])+p[j+1]-p[i];
  18. }
  19.  
  20. ll g(int k,int l,int j){
  21.     return (dp[k+1][j-1] - dp[l+1][j-1]+((long long)l)*s[l+1]-((long long)k)*s[k+1]-p[l+1]+p[k+1])/((long long)(l-k));
  22. }
  23.  
  24. int main(){
  25.     int n,K;
  26.     cin >> n >> K;
  27.     for (int i = n ; i >= 1 ; i--){
  28.         cin >> w[i];
  29.         s[i] = s[i+1] + w[i];
  30.         p[i] = p[i+1] + i*w[i];
  31.     }
  32.  
  33.     for(int j = 1 ; j <= K ; j++){
  34.         dp[n+1][j] = 1LL << 50;
  35.     }
  36.  
  37.     for(int i = 1 ; i <= n ; i++){
  38.         dp[i][1] = cost(i,n);
  39.     }
  40.  
  41.     for(int j = 2 ; j <= K ; j++){
  42.         dp[n][j] = 0LL;
  43.         int head = 0, tail = 0;
  44.         Q[tail] = n;
  45.         for(int i = n-1 ; i >= 1 ; i--){
  46.             while((tail-head > 0) && (g(Q[head+1],Q[head],j) <= s[i])){
  47.                 head++;
  48.             }
  49.             dp[i][j] = cost(i,Q[head]) + dp[Q[head]][j];
  50.             while((tail-head > 0) && (g(i,Q[tail],j) <= g(Q[tail],Q[tail-1],j))){
  51.                 tail--;
  52.             }
  53.             tail++;
  54.             Q[tail] = i;
  55.         }
  56.     }
  57.  
  58.     cout << dp[1][K] << endl;
  59.     return 0;
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement