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...