제출 #1370097

#제출 시각아이디문제언어결과실행 시간메모리
1370097domiK blocks (IZhO14_blocks)C++20
100 / 100
145 ms80528 KiB
#include <bits/stdc++.h>

#define int long long
#define fi first
#define se second

#define sz(a) (int)((a).size())
#define all(a) (a).begin(), (a).end()

#define lsb(x) (x & (-x))
#define vi vector<int>
#define YES { cout << "YES" << endl; return; }
#define NO { cout << "NO" << endl; return; }

using ll = long long;
using pii = std::pair<int, int>;

const int NMAX = 1e5;
const int KMAX = 1e2;

using namespace std;

int dp[KMAX + 5][NMAX + 5], a[NMAX + 5], n, k;

signed main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    cin >> n >> k;

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

    dp[1][0] = INT_MIN;
    for (int i = 1; i <= n; ++i)
        dp[1][i] = max(dp[1][i - 1], a[i]);

    for (int used = 2; used <= k; ++used) {
        stack<array<int, 3>> stk; ///(mx, dp_val, mn_pref)
        for (int i = used; i <= n; ++i) {
            array<int, 3> cur = {a[i], dp[used - 1][i - 1], 0};
            while (!stk.empty() && stk.top()[0] < cur[0]) {
                cur[1] = min(cur[1], stk.top()[1]);
                stk.pop();
            }

            cur[2] = cur[0] + cur[1];
            if (!stk.empty())
                cur[2] = min(cur[2], stk.top()[2]);

            stk.push(cur);
            dp[used][i] = cur[2];
        }
    }

    cout << dp[k][n] << '\n';
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…