Submission #1246417

#TimeUsernameProblemLanguageResultExecution timeMemory
1246417rhombusFeast (NOI19_feast)C++20
18 / 100
896 ms34420 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll inf = 1e18; pair <ll, int> calc(vector <int> &a, ll lambda) { int n = (int) a.size(); vector dp(n + 1, vector (2, 0ll)); vector mn(n + 1, vector (2, 0ll)); dp[0][0] = 0; dp[0][1] = -inf; mn[0][0] = 0; mn[0][1] = inf; for (int i = 1; i <= n; i++) { int x = a[i - 1]; dp[i][0] = dp[i - 1][0]; mn[i][0] = mn[i - 1][0]; if (dp[i - 1][1] > dp[i][0]) { dp[i][0] = dp[i - 1][1]; mn[i][0] = mn[i - 1][1]; } else if (dp[i - 1][1] == dp[i][0]) { mn[i][0] = min(mn[i - 1][1], mn[i][0]); } dp[i][1] = x + dp[i - 1][1]; mn[i][1] = mn[i - 1][1]; if (lambda + x + dp[i - 1][0] > dp[i][1]) { dp[i][1] = lambda + x + dp[i - 1][0]; mn[i][1] = mn[i - 1][0] + 1; } else if (lambda + x + dp[i - 1][0] == dp[i][1]) { mn[i][1] = min(mn[i][1], 1 + mn[i - 1][0]); } } pair <ll, ll> ans; ans.first = max(dp[n][0], dp[n][1]); if (dp[n][0] == dp[n][1]) { ans.second = min(mn[n][0], mn[n][1]); } else if (dp[n][0] > dp[n][1]) { ans.second = mn[n][0]; } else { ans.second = mn[n][1]; } return ans; } int main() { ios::sync_with_stdio(0); cin.tie(0); int n, k; cin >> n >> k; vector <int> a(n); for (int i = 0; i < n; i++) { cin >> a[i]; } ll l = -1e12 - 7, r = 1e12 + 7; while (l <= r) { ll mid = (l + r) / 2; if (calc(a, mid).second <= k) { l = mid + 1; } else { r = mid - 1; } } ll score = calc(a, r).first - calc(a, r).second * (ll) r; cout << max(0ll, score) << '\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...