Submission #108671

#TimeUsernameProblemLanguageResultExecution timeMemory
108671bibabasK blocks (IZhO14_blocks)C++14
100 / 100
311 ms248876 KiB
#ifdef LOCAL
#define _GLIBCXX_DEBUG
#endif
#include <bits/stdc++.h>
#define ll long long
#define vi vector<ll>
#define vvi vector<vi>
#define all(x) x.begin(), x.end()
#define pb push_back

ll INF = (ll)1e18;

using namespace std;

template <class T>
istream& operator >>(istream &in, vector<T> &arr) {
    for (T &cnt : arr) {
        in >> cnt;
    }
    return in;
};

void solve() {
    unsigned int n, k; cin >> n >> k;
    vvi pref(n + 1, vi(k + 1, INF));
    vvi dp(n + 1, vi(k + 1, INF));
    vi a(1, INF);
    vvi kek(n + 1, vi(k + 1, 0));
    for (int i = 0; i < n; ++i){
        int c; cin >> c;
        a.pb(c);
    }
    deque<int> stak;
    dp[0][0] = 0;
    stak.push_back(0);
    for (int i = 1; i <= n; ++i){
        dp[i][1] = a[i];
        if (stak.size() != 1)
            dp[i][1] = max(dp[i][1], a[stak[1]]);
        for (int j = 1; j <= k; ++j){
            kek[stak.size()][j] = dp[stak.back()][j];
        }
        while(a[stak.back()] <= a[i]){
            for (int j = 1; j <= k; ++j){
                kek[stak.size() - 1][j] = min(kek[stak.size()][j], kek[stak.size() - 1][j]);
            }
            stak.pop_back();
        }
        for (int j = 1; j <= k; ++j){
            pref[stak.size()][j] = min(pref[stak.size() - 1][j], kek[stak.size()][j] + a[i]);
        }
        stak.push_back(i);
        for (int j = 2; j <= k; ++j){
            dp[i][j] = pref[stak.size() - 1][j - 1];
        }
    }
    cout << dp[n][k];
}

int main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#else
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
#endif

    solve();

    return 0;
}

Compilation message (stderr)

blocks.cpp: In function 'void solve()':
blocks.cpp:29:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < n; ++i){
                     ~~^~~
blocks.cpp:36:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 1; i <= n; ++i){
                     ~~^~~~
blocks.cpp:40:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int j = 1; j <= k; ++j){
                         ~~^~~~
blocks.cpp:44:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for (int j = 1; j <= k; ++j){
                             ~~^~~~
blocks.cpp:49:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int j = 1; j <= k; ++j){
                         ~~^~~~
blocks.cpp:53:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int j = 2; j <= k; ++j){
                         ~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...