Submission #1301192

#TimeUsernameProblemLanguageResultExecution timeMemory
1301192i_elhdadFeast (NOI19_feast)C++20
18 / 100
233 ms2632 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using i128 = __int128_t;

struct Node {
    i128 val;
    int cnt;
    Node(i128 v = (i128)-9e36, int c = 0) : val(v), cnt(c) {}
};

inline Node better(const Node &a, const Node &b){
    if (a.val != b.val) return (a.val > b.val) ? a : b;
    return (a.cnt < b.cnt) ? a : b; // prefer fewer segments on tie
}

pair<i128,int> solve_with_lambda(const vector<ll> &A, i128 lambda){
    int n = (int)A.size();
    Node dp((i128)0, 0);           // best for prefix
    Node best_end((i128)-9e36,0);  // best that ends at current i
    for (int i = 0; i < n; ++i){
        Node extend = Node(best_end.val + (i128)A[i], best_end.cnt);
        Node start_new = Node(dp.val + (i128)A[i] - lambda, dp.cnt + 1);
        best_end = better(extend, start_new);
        dp = better(dp, best_end);
    }
    return {dp.val, dp.cnt};
}

// helper to print i128
string to_string_i128(i128 x){
    if (x == 0) return "0";
    bool neg = false;
    if (x < 0){ neg = true; x = -x; }
    string s;
    while (x > 0){
        int digit = (int)(x % 10);
        s.push_back('0' + digit);
        x /= 10;
    }
    if (neg) s.push_back('-');
    reverse(s.begin(), s.end());
    return s;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int N;
    long long K;
    if (!(cin >> N >> K)) return 0;
    vector<ll> A(N);
    for (int i = 0; i < N; ++i) cin >> A[i];

    // set safe search bounds (i128)
    // choose bounds based on absolute sum to reduce useless extremes
    i128 sumAbs = 0;
    for (ll x : A) sumAbs += (i128) llabs(x);
    i128 lo = -sumAbs - 1;   // a bit more margin
    i128 hi =  sumAbs + 1;

    // binary search largest lambda such that cnt >= K
    while (lo < hi) {
        i128 mid = lo + (hi - lo + 1) / 2;
        auto [val, cnt] = solve_with_lambda(A, mid);
        if (cnt >= (int)K) lo = mid;
        else hi = mid - 1;
    }
    i128 lambda = lo;
    auto [val, cnt] = solve_with_lambda(A, lambda);
    i128 answer = val + lambda * (i128)K; // safe in i128
    cout << to_string_i128(answer) << '\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...