Submission #1224941

#TimeUsernameProblemLanguageResultExecution timeMemory
1224941shoeibFeast (NOI19_feast)C++20
0 / 100
187 ms8516 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using db = double; const int MAXN = 300005; const db EPS = 1e-6; ll n, k; vector<ll> a, pre; db dp[MAXN]; int opt[MAXN]; // 0 = skip, 1 = take segment pair<ll, ll> slv(db mid) { dp[0] = 0; opt[0] = 0; pair<db, ll> best = {0, 0}; // (dp[j] - pre[j], count) for (ll i = 1; i <= n; ++i) { db take_val = best.first + pre[i] - mid; ll take_cnt = best.second + 1; if (dp[i - 1] > take_val) { dp[i] = dp[i - 1]; opt[i] = 0; } else { dp[i] = take_val; opt[i] = 1; } db candidate_val = dp[i] - pre[i]; ll candidate_cnt = (opt[i] == 1 ? take_cnt : best.second); if (make_pair(candidate_val, candidate_cnt) > best) { best = {candidate_val, candidate_cnt}; } } // Count segments ll seg_cnt = 0; for (ll i = n; i >= 1; --i) { if (opt[i] == 1) { seg_cnt++; while (i > 0 && opt[i] == 1 && dp[i] - pre[i] == dp[i - 1] - pre[i - 1]) i--; } } return {seg_cnt, 0}; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> k; a.resize(n + 1); pre.assign(n + 1, 0); for (ll i = 1; i <= n; ++i) { cin >> a[i]; pre[i] = pre[i - 1] + a[i]; } db lo = 0, hi = 1e6; for (int it = 0; it < 40; ++it) { db mid = (lo + hi) / 2; auto [cnt, _] = slv(mid); if (cnt > k) lo = mid + EPS; else hi = mid; } slv(hi); cout << dp[n] + hi * k << "\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...