Submission #1211262

#TimeUsernameProblemLanguageResultExecution timeMemory
1211262maltaFeast (NOI19_feast)C++20
18 / 100
82 ms10888 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 val = 0; int cnt0 = 0; for (int i = 1; i <= n; i++) { dp[i] = dp[i-1]; cnt[i] = cnt[i-1]; i128 dpi = val + (i128)pfs[i] + C; int ci = cnt0 + 1; if (dpi > dp[i]) { dp[i] = dpi; cnt[i] = ci; } i128 cur = dp[i] - (i128)pfs[i]; if (cur > val) { val = cur; cnt0 = 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, 0); 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; } i128 lo = -(i128)1e14, hi = (i128)1e14; i128 c0 = hi, dp0 = 0; while (lo <= hi) { i128 mid = lo + ((hi - lo) >> 1); auto [dpC, kC] = dpc(pfs, mid); if (kC >= k) { c0 = mid; dp0 = dpC; hi = mid - 1; } else { lo = mid + 1; } } i128 ans128 = dp0 - c0 * k; ll answer = (ll)ans128; cout << 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...