Submission #474556

#TimeUsernameProblemLanguageResultExecution timeMemory
474556PurpleCrayonFeast (NOI19_feast)C++17
100 / 100
899 ms17440 KiB
#include <bits/stdc++.h> using namespace std; #define sz(v) int(v.size()) #define ar array typedef long long ll; const int MAXN = 3e5+10, MOD = 1e9+7; using ld = long double; #define double ld int n, k; ll a[MAXN], ps[MAXN]; pair<double, ll> dp[MAXN]; pair<double, ll> v(double x) { // cnt, cost fill(dp, dp+n, make_pair(0., 0ll)); pair<double, ll> prv{0., 0}; for (int i = 0; i < n; i++) { if (i) dp[i] = dp[i-1]; // {ps[i] - ps[j] + dp[j].first, dp[j].second + 1} dp[i] = max(dp[i], make_pair(prv.first + ps[i] - x, prv.second + 1)); prv = max(prv, make_pair(-ps[i] + dp[i].first, dp[i].second)); } return dp[n-1]; } void solve() { cin >> n >> k; for (int i = 0; i < n; i++) cin >> a[i]; for (int i = 0; i < n; i++) ps[i] = a[i] + (i ? ps[i-1] : 0); bool bad = 0; for (int i = 0; i < n; i++) if (a[i] < 0) bad = 1; if (!bad) { cout << ps[n-1] << '\n'; return; } double lo = 0, hi = 1e18; for (int rep = 0; rep < 100; rep++) { double mid = (lo + hi) / 2; if (v(mid).second >= k) lo = mid; else hi = mid; } double opt = lo; auto [ans, cnt] = v(opt); ans += opt * cnt; cout << llround(ans) << '\n'; } int main(){ ios::sync_with_stdio(false); cin.tie(0); int T=1; //cin >> T; while (T--) solve(); }
#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...