Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "bits/stdc++.h"
- using namespace std;
- #define ar array
- typedef long long ll;
- #define int ll
- const int N = 2e4 + 5;
- const int M = 15;
- int dp[N], tp[N], h[N], mx[N][M];
- signed main() {
- ios::sync_with_stdio(0);
- cin.tie(0);
- int n, k;
- cin >> n >> k;
- for (int i = 1; i <= n; i++) {
- cin >> h[i];
- dp[i] = max(dp[i - 1], h[i]);
- mx[i][0] = h[i];
- }
- for (int i = 1; i <= n; i++) {
- dp[i] *= i;
- }
- for (int j = 1; j < M; j++) {
- for (int i = 1; i + (1 << (j - 1)) <= n; i++) {
- mx[i][j] = max(mx[i][j - 1], mx[i + (1 << (j - 1))][j - 1]);
- }
- }
- auto get = [&](int l, int r) {
- int lg = __lg(r - l + 1);
- return max(mx[l][lg], mx[r - (1 << lg) + 1][lg]);
- };
- function<void(int, int, int, int)> go = [&](int l, int r, int l_, int r_) {
- if (l > r)
- return;
- int m = (l + r) >> 1, pos = l_;
- for (int j = l_; j <= min(r_, m - 1); j++) {
- int v = get(j + 1, m) * 1ll * (m - j) + dp[j];
- if (v <= tp[m]) {
- tp[m] = v;
- pos = j;
- }
- }
- go(l, m - 1, l_, pos);
- go(m + 1, r, pos, r_);
- };
- //~ for(int i=1;i<=n;i++) cout<<dp[i]<<" ";
- // ~ cout<<"\n";
- for (int j = 1; j < k; j++) {
- memset(tp, 63, sizeof tp);
- go(1, n, 1, n);
- swap(tp, dp);
- }
- cout << dp[n] - accumulate(h + 1, h + n + 1, 0) << "\n";
- }
- /*
- 7 3
- 6 4 1 5 3 2 2
- 4 2
- 6 1 7 4
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement