제출 #1363711

#제출 시각아이디문제언어결과실행 시간메모리
1363711yeongminbFeast (NOI19_feast)C++20
100 / 100
222 ms12216 KiB
#include <bits/stdc++.h>
#define fastio cin.tie(0)->ios::sync_with_stdio(0);
using namespace std;
typedef long long ll;
ll N,K;
vector<ll> A;

pair<ll,ll> f(ll m){
    vector<ll> dp1(N, 0), dp2(N, 0), cnt1(N, 0), cnt2(N, 0);
    dp2[0] = A[0] - m; cnt2[0] = 1;
    for(ll i=1;i<N;i++){
        if(dp1[i-1] > dp2[i-1] || (dp1[i-1] == dp2[i-1] && cnt1[i-1] > cnt2[i-1])) dp1[i] = dp1[i-1], cnt1[i] = cnt1[i-1];
        else dp1[i] = dp2[i-1], cnt1[i] = cnt2[i-1];
        
        if(dp1[i-1] - m > dp2[i-1] || (dp1[i-1] - m == dp2[i-1] && cnt1[i-1] + 1 > cnt2[i-1])) dp2[i] = dp1[i-1] - m + A[i], cnt2[i] = cnt1[i-1] + 1;
        else dp2[i] = dp2[i-1] + A[i], cnt2[i] = cnt2[i-1];
    }

    if(dp1[N-1] > dp2[N-1] || (dp1[N-1] == dp2[N-1] && cnt1[N-1] > cnt2[N-1])) return {dp1[N-1], cnt1[N-1]};
    return {dp2[N-1], cnt2[N-1]};
}

int main(){
    fastio;
    ll l=0,r=0;
    cin >> N >> K;
    A.resize(N);
    for(auto &a : A) cin >> a, r+=(a>0)?a:0;

    ll mopt;
    while(l <= r){
        ll m = (l + r)/2;
        auto [v, c] = f(m);
        if(c <= K){
            r = m - 1;
            mopt = m;
        } else l = m + 1;
    }

    auto [v, c] = f(mopt);
    cout << v + c*mopt;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…