Advertisement
mickypinata

CUBE-T197: Fair and Square

Sep 6th, 2021
850
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.26 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long lli;
  5.  
  6. const int N = 1500;
  7. const int K = 50;
  8.  
  9. int arr[N + 1];
  10. lli cost[N + 1][N + 1], dp[N + 1][K + 1], sumL, sumR;
  11. priority_queue<int> l;
  12. priority_queue<int, vector<int>, greater<int>> r;
  13.  
  14. void medSetup(){
  15.     while(!l.empty()){
  16.         l.pop();
  17.     }
  18.     while(!r.empty()){
  19.         r.pop();
  20.     }
  21.     sumL = 0;
  22.     sumR = 0;
  23. }
  24.  
  25. void medInsert(int x){
  26.     if(l.empty() || x < l.top()){
  27.         if(((int)l.size() + r.size()) % 2 == 1){
  28.             sumR += l.top();
  29.             r.push(l.top());
  30.             sumL -= l.top();
  31.             l.pop();
  32.         }
  33.         sumL += x;
  34.         l.push(x);
  35.     } else if(r.empty() || x > r.top()){
  36.         if(((int)l.size() + r.size()) % 2 == 0){
  37.             sumL += r.top();
  38.             l.push(r.top());
  39.             sumR -= r.top();
  40.             r.pop();
  41.         }
  42.         sumR += x;
  43.         r.push(x);
  44.     } else {
  45.         if(((int)l.size() + r.size()) % 2 == 1){
  46.             sumR += x;
  47.             r.push(x);
  48.         } else {
  49.             sumL += x;
  50.             l.push(x);
  51.         }
  52.     }
  53. }
  54. lli medMinCost(){
  55.     if(((int)l.size() + r.size()) % 2 == 1){
  56.         return (lli)l.size() * l.top() - sumL + sumR - (lli)r.size() * l.top();
  57.     } else {
  58.         lli ansL = (lli)l.size() * l.top() - sumL + sumR - (lli)r.size() * l.top();
  59.         lli ansR = (lli)l.size() * r.top() - sumL + sumR - (lli)r.size() * r.top();
  60.         return min(ansL, ansR);
  61.     }
  62. }
  63.  
  64. int main(){
  65.  
  66.     int n, parts;
  67.     scanf("%d%d", &n, &parts);
  68.     for(int i = 1; i <= n; ++i){
  69.         scanf("%d", &arr[i]);
  70.     }
  71.     for(int i = 1; i <= n; ++i){
  72.         medSetup();
  73.         for(int j = i; j <= n; ++j){
  74.             medInsert(arr[j]);
  75.             cost[i][j] = medMinCost();
  76.         }
  77.     }
  78.     dp[0][0] = 0;
  79.     for(int i = 1; i <= n; ++i){
  80.         dp[i][0] = 1e18;
  81.     }
  82.     for(int p = 1; p <= parts; ++p){
  83.         dp[0][p] = 1e18;
  84.     }
  85.     for(int i = 1; i <= n; ++i){
  86.         for(int p = 1; p <= parts; ++p){
  87.             lli mn = 1e18;
  88.             for(int j = 1; j <= i; ++j){
  89.                 mn = min(mn, cost[j][i] + dp[j - 1][p - 1]);
  90.             }
  91.             dp[i][p] = mn;
  92.         }
  93.     }
  94.     cout << dp[n][parts];
  95.  
  96.     return 0;
  97. }
  98.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement