제출 #1229142

#제출 시각아이디문제언어결과실행 시간메모리
1229142Adomas08Feast (NOI19_feast)C++20
100 / 100
116 ms12168 KiB
#include <bits/stdc++.h>

using namespace std;

int main(){
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    int n, k;
    cin >> n >> k;
    long long a[n+1];
    for (int i = 1; i <= n; i++) cin >> a[i];
    long long s = 0, e = 3 * 1e14;
    pair<long long, int> dp[n+1][2];
    while (s != e){
        long long m = (s + e+1) / 2;
        dp[0][0] = {0, 0};
        dp[0][1] = {LLONG_MIN, LLONG_MIN};
        for (int i = 1; i <= n; i++){
            if (dp[i-1][0].first > dp[i-1][1].first){
                dp[i][0] = dp[i-1][0];
            }
            if (dp[i-1][0].first < dp[i-1][1].first){
                dp[i][0] = dp[i-1][1];
            }
            if (dp[i-1][0].first == dp[i-1][1].first){
                dp[i][0] = {dp[i-1][0].first, max(dp[i-1][0].second, dp[i-1][1].second)};
            }
            if (dp[i-1][0].first - m > dp[i-1][1].first){
                dp[i][1] = {dp[i-1][0].first + a[i] - m, dp[i-1][0].second + 1};
            }
            if (dp[i-1][0].first - m < dp[i-1][1].first){
                dp[i][1] = {dp[i-1][1].first + a[i], dp[i-1][1].second};
            }
            if (dp[i-1][0].first - m == dp[i-1][1].first){
                dp[i][1] = {dp[i-1][1].first + a[i], max(dp[i-1][0].second + 1, dp[i-1][1].second)};
            }
        }
        long long amo;
        if (dp[n][0].first > dp[n][1].first){
            amo = dp[n][0].second;
        }
        if (dp[n][0].first < dp[n][1].first){
            amo = dp[n][1].second;
        }
        if (dp[n][0].first == dp[n][1].first){
            amo = max(dp[n][1].second, dp[n][0].second);
        }
        if (amo < k){
            e = m - 1;
        }
        else{
            s = m;
        }
    }
    long long m = s;
    dp[0][0] = {0, 0};
    dp[0][1] = {LLONG_MIN, LLONG_MIN};
        for (int i = 1; i <= n; i++){
            if (dp[i-1][0].first > dp[i-1][1].first){
                dp[i][0] = dp[i-1][0];
            }
            if (dp[i-1][0].first < dp[i-1][1].first){
                dp[i][0] = dp[i-1][1];
            }
            if (dp[i-1][0].first == dp[i-1][1].first){
                dp[i][0] = {dp[i-1][0].first, max(dp[i-1][0].second, dp[i-1][1].second)};
            }
            if (dp[i-1][0].first - m > dp[i-1][1].first){
                dp[i][1] = {dp[i-1][0].first + a[i] - m, dp[i-1][0].second + 1};
            }
            if (dp[i-1][0].first - m < dp[i-1][1].first){
                dp[i][1] = {dp[i-1][1].first + a[i], dp[i-1][1].second};
            }
            if (dp[i-1][0].first - m == dp[i-1][1].first){
                dp[i][1] = {dp[i-1][1].first + a[i], max(dp[i-1][0].second + 1, dp[i-1][1].second)};
            }
        }
    cout << s * k + max(dp[n][0].first, dp[n][1].first);
}
#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...