Alex_tz307

Kattis Estimation

Apr 5th, 2021
854
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.49 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3.  
  4. using namespace std;
  5.  
  6. void fastIO() {
  7.   ios_base::sync_with_stdio(false);
  8.   cin.tie(nullptr);
  9.   cout.tie(nullptr);
  10. }
  11.  
  12. const int NMAX = 2e3 + 3;
  13. const int INF = 1e18L;
  14. int a[NMAX], cost[NMAX][NMAX], dp[NMAX];
  15.  
  16. void min_self(int &a, int b) {
  17.   a = min(a, b);
  18. }
  19.  
  20. void solve() {
  21.   int N, K;
  22.   cin >> N >> K;
  23.   for (int i = 1; i <= N; ++i)
  24.     cin >> a[i];
  25.   for (int i = 1; i <= N; ++i) {
  26.     priority_queue<int> lower;
  27.     priority_queue<int,vector<int>,greater<int>> upper;
  28.     int sum_lower = 0, sum_upper = 0;
  29.     for (int j = i; j <= N; ++j) {
  30.       sum_lower += a[j];
  31.       lower.emplace(a[j]);
  32.       if (lower.size() > upper.size() + 1 || (!upper.empty() && lower.top() > upper.top())) {
  33.         int aux = lower.top();
  34.         lower.pop();
  35.         sum_lower -= aux, sum_upper += aux;
  36.         upper.emplace(aux);
  37.       }
  38.       if (upper.size() > lower.size()) {
  39.         int aux = upper.top();
  40.         upper.pop();
  41.         sum_lower += aux, sum_upper -= aux;
  42.         lower.emplace(aux);
  43.       }
  44.       int median = lower.top();
  45.       cost[i][j] = lower.size() * median - sum_lower + sum_upper - upper.size() * median;
  46.     }
  47.   }
  48.   for (int i = 1; i <= N; ++i)
  49.     dp[i] = INF;
  50.   for (int k = 0; k < K; ++k)
  51.     for (int i = N - 1; i >= 0; --i)
  52.       for (int j = i + 1; j <= N; ++j)
  53.         min_self(dp[j], dp[i] + cost[i + 1][j]);
  54.   cout << dp[N] << '\n';
  55. }
  56.  
  57. int32_t main() {
  58.   fastIO();
  59.   solve();
  60.   return 0;
  61. }
  62.  
Advertisement
Add Comment
Please, Sign In to add comment