Advertisement
senb1

krsu 3408 (whos code is this?)

Mar 29th, 2023
710
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.55 KB | None | 0 0
  1. #include "bits/stdc++.h"
  2. using namespace std;
  3.  
  4. #define ar array
  5. typedef long long ll;
  6. #define int ll
  7.  
  8. const int N = 2e4 + 5;
  9. const int M = 15;
  10. int dp[N], tp[N], h[N], mx[N][M];
  11.  
  12. signed main() {
  13.     ios::sync_with_stdio(0);
  14.     cin.tie(0);
  15.  
  16.     int n, k;
  17.     cin >> n >> k;
  18.     for (int i = 1; i <= n; i++) {
  19.         cin >> h[i];
  20.         dp[i] = max(dp[i - 1], h[i]);
  21.         mx[i][0] = h[i];
  22.     }
  23.     for (int i = 1; i <= n; i++) {
  24.         dp[i] *= i;
  25.     }
  26.  
  27.     for (int j = 1; j < M; j++) {
  28.         for (int i = 1; i + (1 << (j - 1)) <= n; i++) {
  29.             mx[i][j] = max(mx[i][j - 1], mx[i + (1 << (j - 1))][j - 1]);
  30.         }
  31.     }
  32.  
  33.     auto get = [&](int l, int r) {
  34.         int lg = __lg(r - l + 1);
  35.         return max(mx[l][lg], mx[r - (1 << lg) + 1][lg]);
  36.     };
  37.  
  38.     function<void(int, int, int, int)> go = [&](int l, int r, int l_, int r_) {
  39.         if (l > r)
  40.             return;
  41.         int m = (l + r) >> 1, pos = l_;
  42.         for (int j = l_; j <= min(r_, m - 1); j++) {
  43.             int v = get(j + 1, m) * 1ll * (m - j) + dp[j];
  44.             if (v <= tp[m]) {
  45.                 tp[m] = v;
  46.                 pos = j;
  47.             }
  48.         }
  49.  
  50.         go(l, m - 1, l_, pos);
  51.         go(m + 1, r, pos, r_);
  52.     };
  53.  
  54.     //~ for(int i=1;i<=n;i++) cout<<dp[i]<<" ";
  55.     // ~ cout<<"\n";
  56.  
  57.     for (int j = 1; j < k; j++) {
  58.         memset(tp, 63, sizeof tp);
  59.         go(1, n, 1, n);
  60.         swap(tp, dp);
  61.     }
  62.  
  63.     cout << dp[n] - accumulate(h + 1, h + n + 1, 0) << "\n";
  64. }
  65. /*
  66.  
  67. 7 3
  68. 6 4 1 5 3 2 2
  69.  
  70. 4 2
  71. 6 1 7 4
  72.  
  73. */
  74.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement