Submission #1208133

#TimeUsernameProblemLanguageResultExecution timeMemory
1208133gatapdevK blocks (IZhO14_blocks)C++20
0 / 100
1 ms328 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 1e18;

int n, K;
vector<int> a;
vector<vector<int>> dp;
vector<vector<int>> st; // sparse table for RMQ
vector<int> logTable;

// Sparse Table for max
void buildSparseTable() {
    int maxLog = log2(n) + 1;
    st.assign(maxLog, vector<int>(n + 1));
    logTable.resize(n + 1);
    logTable[1] = 0;
    for (int i = 2; i <= n; ++i)
        logTable[i] = logTable[i / 2] + 1;

    for (int i = 1; i <= n; ++i)
        st[0][i] = a[i];

    for (int k = 1; (1 << k) <= n; ++k) {
        for (int i = 1; i + (1 << k) - 1 <= n; ++i) {
            st[k][i] = max(st[k - 1][i], st[k - 1][i + (1 << (k - 1))]);
        }
    }
}

int getMax(int l, int r) {
    if (l > r) return 0;
    int k = logTable[r - l + 1];
    return max(st[k][l], st[k][r - (1 << k) + 1]);
}

void compute(int k, int l, int r, int optL, int optR) {
    if (l > r) return;
    int mid = (l + r) / 2;
    pair<int, int> best = {INF, -1};

    for (int j = optL; j <= min(mid - 1, optR); ++j) {
        int cost = dp[k - 1][j] + getMax(j + 1, mid);
        if (cost < best.first) {
            best = {cost, j};
        }
    }

    dp[k][mid] = best.first;

    compute(k, l, mid - 1, optL, best.second);
    compute(k, mid + 1, r, best.second, optR);
}

int32_t main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> n >> K;
    a.resize(n + 1);
    for (int i = 1; i <= n; ++i)
        cin >> a[i];

    buildSparseTable();

    dp.assign(K + 1, vector<int>(n + 1, INF));
    for (int i = 1; i <= n; ++i)
        dp[1][i] = getMax(1, i);

    for (int k = 2; k <= K; ++k)
        compute(k, 1, n, 0, n - 1);

    cout << dp[K][n] << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...