제출 #1211334

#제출 시각아이디문제언어결과실행 시간메모리
1211334maltaFeast (NOI19_feast)C++20
18 / 100
114 ms7452 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n, k;
    cin >> n >> k;
    vector<ll> a(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }
    
    vector<ll> prefix(n + 1, 0);
    for (int i = 1; i <= n; ++i) {
        prefix[i] = prefix[i - 1] + a[i - 1];
    }
    
    ll lo = -1e14, hi = 1e14;
    ll ans = -1e18;
    for (int iter = 0; iter < 100; ++iter) {
        ll mid = lo + (hi - lo) / 2;
        vector<ll> dp(n + 1, -1e18);
        dp[0] = 0;
        ll max_val = -1e18;
        for (int i = 1; i <= n; ++i) {
            if (i >= 2) {
                max_val = max(max_val, dp[i - 1] - prefix[i - 1]);
            } else {
                max_val = dp[0] - prefix[0]; // 0
            }
            ll candidate = max_val + prefix[i] - mid;
            dp[i] = max(dp[i - 1], candidate);
        }
        int s = 0;
        for (int i = 1; i <= n; ++i) {
            if (dp[i] > dp[i - 1]) {
                s++;
            }
        }
        if (s == k) {
            ans = dp[n] + mid * k;
        }
        // Adjust binary search
        if (s > k) {
            lo = mid + 1;
        } else {
            hi = mid - 1;
        }
    }
    
    cout << ans << '\n';
    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...