Submission #365918

#TimeUsernameProblemLanguageResultExecution timeMemory
365918mickeyandkakaFeast (NOI19_feast)C++17
100 / 100
170 ms16384 KiB
//{{{ #include <bits/stdc++.h> using namespace std; using LL = long long; using VLL = vector<LL>; using vi = vector<int>; using pii = pair<int, int>; #define sz(x) (int)((x).size()) #define all(x) (x).begin(), (x).end() #define clr(a, b) memset(a, b, sizeof(a)) #ifdef LOCAL #include "prettyprint.hpp" // clang-format off void _print() { cerr << "]\033[0m\n"; } template <typename T> void __print(T x) { cerr << x; } template <typename T, typename... V> void _print(T t, V... v) { __print(t); if (sizeof...(v)) cerr << ", "; _print(v...); } #define debug(x...) cerr << "\033[1;34m[" << #x << "] = \033[1;32m["; _print(x) #define debug_arr(x...) cerr << "\033[1;34m[" << #x << "] = \033[1;32m" << (x) << "\033[0m\n" #else #define debug(x...) #define debug_arr(x...) #endif // clang-format on //}}} const int N = 3e5 + 10; // const int N = 10; int n, k; int a[N]; LL s[N]; LL dp[N]; LL cnt[N]; LL minf[N]; LL minf_p[N]; int check(LL c) { dp[0] = 0, cnt[0] = 0; minf[0] = dp[0] - s[0]; minf_p[0] = 0; for (int i = 1; i <= n; i++) { dp[i] = dp[i - 1]; cnt[i] = cnt[i - 1]; if (minf[i - 1] + s[i] - c > dp[i]) { dp[i] = minf[i - 1] + s[i] - c; // debug(i, dp[i]); cnt[i] = cnt[minf_p[i - 1]] + 1; } minf[i] = minf[i - 1]; minf_p[i] = minf_p[i - 1]; if (dp[i] - s[i] > minf[i]) { minf[i] = dp[i] - s[i]; minf_p[i] = i; } } // if (cnt[n] == 0) return k + 1; return cnt[n]; } int main() { #ifdef LOCAL freopen("in", "r", stdin); // freopen("out", "w", stdout); #endif ios::sync_with_stdio(false); cin.tie(0); while (cin >> n >> k) { for (int i = 1; i <= n; ++i) cin >> a[i]; s[0] = 0; for (int i = 1; i <= n; ++i) s[i] = s[i - 1] + a[i]; // double lo = 0, hi = 1e18; LL lo = 0, hi = 1e15; while (lo + 1 < hi) // for (int o = 1; o <= 100; o++) { LL mid = lo + (hi - lo) / 2; // double mid = (lo + hi) / 2.0; // debug(lo, hi, mid); // cout << lo << " " << hi << " " << mid << " "; if (check(mid) <= k) hi = mid; else lo = mid; // cout << cnt[n] << endl; // if (hi - lo < 1e-2) break; // debug(lo, hi, cnt[n]); } // debug(lo, hi); // debug(hi); // for (int p = -100; p <= 100; p++) //{ // check(p); // debug(p, cnt[n]); //} // debug("======"); // double lo = -2; // check(lo); // debug_arr(dp); // debug_arr(cnt); // double hi = -0.9999; check(hi); // debug_arr(dp); // debug_arr(cnt); LL ans = dp[n] + hi * cnt[n]; // debug(ans); // ans = max(ans, 0.0); // ans = LL(ans); cout << ans << endl; } 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...