Submission #1211273

#TimeUsernameProblemLanguageResultExecution timeMemory
1211273maltaFeast (NOI19_feast)C++20
4 / 100
125 ms10892 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using i128 = __int128_t; pair<i128,int> dpc(const vector<ll>& pfs, i128 C) { int n = pfs.size() - 1; vector<i128> dp(n+1, (i128)LLONG_MIN * 2); vector<int> cnt(n+1, 0); dp[0] = 0; cnt[0] = 0; i128 best_val = 0; int best_cnt = 0; for (int i = 1; i <= n; i++) { dp[i] = dp[i-1]; cnt[i] = cnt[i-1]; i128 cand = best_val + (i128)pfs[i] + C; int c2 = best_cnt + 1; if (cand > dp[i]) { dp[i] = cand; cnt[i] = c2; } i128 cur = dp[i] - (i128)pfs[i]; if (cur > best_val) { best_val = cur; best_cnt = cnt[i]; } } return {dp[n], cnt[n]}; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n, k; cin >> n >> k; vector<ll> a(n+1), pfs(n+1); for (int i = 1; i <= n; i++) { cin >> a[i]; pfs[i] = pfs[i-1] + a[i]; } if (*max_element(a.begin()+1, a.end()) <= 0) { cout << 0 << "\n"; return 0; } auto [dp0_0, k0] = dpc(pfs, 0); if (k0 <= k) { cout << (long long)dp0_0 << "\n"; return 0; } i128 lo = 0, hi = (i128)1e14; i128 c0 = 0, dp0 = 0; while (lo <= hi) { i128 mid = lo + ((hi - lo) >> 1); auto [dpC, kC] = dpc(pfs, mid); if (kC >= k) { c0 = mid; dp0 = dpC; lo = mid + 1; } else { hi = mid - 1; } } i128 ans128 = dp0 - c0 * k; cout << (long long)ans128 << "\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...