Advertisement
arujbansal

Array Splitting

Apr 26th, 2021
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.86 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <map>
  5. #include <set>
  6. #include <array>
  7. #include <stack>
  8. #include <queue>
  9. #include <random>
  10. #include <numeric>
  11. #include <functional>
  12. #include <chrono>
  13. #include <utility>
  14. #include <iomanip>
  15. #include <assert.h>
  16.  
  17. using namespace std;
  18.  
  19. void dbg_out() { cerr << endl; }
  20. template<typename Head, typename... Tail>
  21. void dbg_out(Head H, Tail... T) { cerr << ' ' << H; dbg_out(T...); }
  22. #define dbg(...) cerr << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__)
  23.  
  24. #define rng_init mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
  25. #define rng_seed(x) mt19937 rng(x)
  26. #define all(x) (x).begin(), (x).end()
  27. #define sz(x) (int) (x).size()
  28. #define int long long
  29.  
  30. const int MXN = 3e5 + 5, INF = 1e18;
  31. int N, K;
  32. int A[MXN];
  33.  
  34. pair<int, int> check(int penalty) {
  35.     vector<int> dp(N + 1, INF), subarrays(N + 1);
  36.     dp[0] = subarrays[0] = 0;
  37.  
  38.     pair<int, int> mn = {-A[1], 0};
  39.  
  40.     for (int i = 1; i <= N; i++) {
  41.         if (dp[i - 1] - A[i] <= mn.first)
  42.             mn = make_pair(dp[i - 1] - A[i], subarrays[i - 1]);
  43.  
  44.         dp[i] = A[i] + mn.first + penalty;
  45.         subarrays[i] = mn.second + 1;
  46.     }
  47.  
  48.     return make_pair(dp[N] - penalty * subarrays[N], subarrays[N]);  
  49. }
  50.  
  51. void solve() {
  52.     cin >> N >> K;
  53.  
  54.     for (int i = 1; i <= N; i++)
  55.         cin >> A[i];
  56.  
  57.     int low = -INF, high = INF;
  58.     while (low <= high) {
  59.         int mid = low + (high - low) / 2;
  60.  
  61.         auto [val, subarrays] = check(mid);
  62.         dbg(mid, val, subarrays);
  63.  
  64.         if (subarrays < K) high = mid - 1;
  65.         else if (subarrays > K) low = mid + 1;
  66.         else {
  67.             cout << val;
  68.             return;
  69.         }
  70.     }
  71. }
  72.  
  73. signed main() {
  74.     ios_base::sync_with_stdio(false);
  75.     cin.tie(nullptr);
  76.  
  77.     int TC = 1;
  78.     // cin >> TC;
  79.     while (TC--) solve();
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement