Submission #1127655

#TimeUsernameProblemLanguageResultExecution timeMemory
1127655thanhphuK blocks (IZhO14_blocks)C++20
0 / 100
0 ms324 KiB
#include <iostream>
#include <vector>
#include <deque>
using namespace std;

const long long inf = 1e18;

int main() {
    int n, k;
    cin >> n >> k;
    vector<int> a(n + 1);
    for (int i = 1; i <= n; ++i) cin >> a[i];

    vector<vector<long long>> dp(k + 1, vector<long long>(n + 1, inf));
    dp[0][0] = 0;

    for (int x = 1; x <= k; ++x) {
        deque<int> dq;
        vector<long long> mx(n + 1, 0);

        for (int i = 1; i <= n; ++i) {
            while (!dq.empty() && dq.front() < i - 1) dq.pop_front();
            while (!dq.empty() && a[dq.back()] <= a[i]) dq.pop_back();
            dq.push_back(i);
            mx[i] = a[dq.front()];
        }

        deque<int> q;
        q.push_back(0);

        for (int i = 1; i <= n; ++i) {
            while (!q.empty() && q.front() < i - 1) q.pop_front();
            dp[x][i] = dp[x - 1][q.front()] + mx[i];
            while (!q.empty() && dp[x - 1][q.back()] >= dp[x - 1][i]) q.pop_back();
            q.push_back(i);
        }
    }

    cout << dp[k][n] << endl;
    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...