Submission #647640

#TimeUsernameProblemLanguageResultExecution timeMemory
647640LeonaRagingK개의 묶음 (IZhO14_blocks)C++14
100 / 100
168 ms3416 KiB
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define ll long long
#define pb push_back
#define db(val) "[" #val " = " << (val) << "] "

const ll mod = 1e9 + 7;
const int maxn = 1e5 + 4;
const int INF = 1e9;
const int N = 16;

int n, k;
ll a[maxn];
vector<ll> f, g;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    //freopen(".INP", "r", stdin);
    //freopen(".OUT", "w", stdout);
    cin >> n >> k;
    f.resize(n + 4), g.resize(n + 4);
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        g[i] = max(g[i - 1], a[i]);
    }
    stack<pair<ll,int>> st;
    for (int t = 2; t <= k; t++) {
        stack<pair<ll,int>>().swap(st);
        f[0] = g[0] = INF;
        for (int i = 1; i <= n; i++) {
            ll candi = g[i - 1];
            while (!st.empty() && a[st.top().se] < a[i]) {
                candi = min(candi, st.top().fi);
                st.pop();
            }
            f[i] = min(candi + a[i], f[st.empty() ? 0 : st.top().se]);
            st.push({candi, i});
        }
        swap(f, g);
    }
    cout << g[n];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...