Submission #366698

#TimeUsernameProblemLanguageResultExecution timeMemory
366698mickeyandkakaFeast (NOI19_feast)C++17
18 / 100
153 ms16236 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) { for (int i = 0; i <= n; i++) dp[i] = INT_MIN; 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]; // mid越大 段数越小 // 段数不超过k // mid尽可能小 LL lo = -1e15, hi = 1e15; while (lo + 1 < hi) { LL mid = lo + (hi - lo) / 2; if (check(mid) <= k) hi = mid; else lo = mid; } debug(lo, hi); int v = check(hi); debug(hi, v); debug(cnt[n], k, dp[n]); LL ans = dp[n] + hi * cnt[n]; ans = max(ans, 0ll); cout << ans << endl; } return 0; }

Compilation message (stderr)

feast.cpp: In function 'int main()':
feast.cpp:102:13: warning: unused variable 'v' [-Wunused-variable]
  102 |         int v = check(hi);
      |             ^
#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...