제출 #1330278

#제출 시각아이디문제언어결과실행 시간메모리
1330278witek_cppFeast (NOI19_feast)C++20
100 / 100
72 ms2628 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

#define st first
#define nd second
#define pb push_back
#define all(a) a.begin(), a.end()
#define sz(a) int(a.size())
#define f(i, a, b) for (int i = a; i < b; i++)
#define rep(i, a) f(i, 0, a)
#define int ll
#define tv(a, x) for (auto& a : x)
#define DUZO 1000000000000000000LL
#define en "\n"
using pii = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vi>;
using vii = vector<pii>;

pii lep(pii a, pii b) {
    if (a.st != b.st) {
        if (a.st > b.st) return a;
        else return b;
    }
    if (a.nd < b.nd) return a;
    else return b;
}

void solve() {
    int n, k;
    cin >> n >> k;
    vi a(n);
    f(i, 0, n) cin >> a[i];
    int l = -1'000'000'000'000;
    int r = 0;
    while (r > l) {
        int mid = (l + r + 1)/2;
        vii dp(2);
        dp = {{0, 0}, {-DUZO, 0}}; //jaki wynik ile otwartych
        //cout << en << "mid=" << mid << en;
        f(i, 0, n) {
            pii o = lep({dp[1].st + a[i], dp[1].nd}, {dp[0].st + mid + a[i], dp[0].nd + 1});
            pii z = lep(dp[0], o);
            dp[0] = z;
            dp[1] = o;
            //cout << "i=" << i << "  " << dp[0].st << " " << dp[1].st << en;
        }
        pii p1 = lep(dp[0], dp[1]);
        if (p1.nd > k) {
            r = mid - 1;
        } else {
            l = mid;
        }
    }
    //cout << "r=" << r << en;
    int mid = r;
    vii dp(2);
    dp = {{0, 0}, {-DUZO, 0}}; //jaki wynik ile otwartych
    f(i, 0, n) {
        pii o = lep({dp[1].st + a[i], dp[1].nd}, {dp[0].st + mid + a[i], dp[0].nd + 1});
        pii z = lep(dp[0], o);
        dp[0] = z;
        dp[1] = o;
    }
    pii p1 = lep(dp[0], dp[1]);
    cout << p1.st - (r *k) << en;
}

int32_t main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int q = 1;
    //cin >> q;
    while (q--) {
        solve();
    }
    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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...