제출 #1211316

#제출 시각아이디문제언어결과실행 시간메모리
1211316maltaFeast (NOI19_feast)C++20
0 / 100
1097 ms6208 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];
    }
    
    auto check = [&](ll lambda) {
        vector<ll> dp(n + 1, -1e18);
        dp[0] = 0;
        vector<int> last(n + 1, -1);
        int used = 0;
        
        for (int i = 1; i <= n; ++i) {
            ll sum = 0;
            for (int j = i; j >= 1; --j) {
                sum += a[j - 1];
                ll val = (j > 1 ? dp[j - 1] : 0) + sum - lambda;
                if (val >= dp[i]) {
                    dp[i] = val;
                    last[i] = j - 1;
                }
            }
            if (dp[i] >= 0) {
                used++;
            }
        }
        
        return used >= k;
    };
    
    ll lo = -1e14, hi = 1e14;
    while (lo < hi) {
        ll mid = lo + (hi - lo + 1) / 2;
        if (check(mid)) {
            lo = mid;
        } else {
            hi = mid - 1;
        }
    }
    
    vector<ll> dp(n + 1, -1e18);
    dp[0] = 0;
    for (int i = 1; i <= n; ++i) {
        ll sum = 0;
        for (int j = i; j >= 1; --j) {
            sum += a[j - 1];
            ll val = (j > 1 ? dp[j - 1] : 0) + sum;
            dp[i] = max(dp[i], val);
        }
    }
    
    cout << dp[n] + lo * k << '\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...