Submission #1246467

#TimeUsernameProblemLanguageResultExecution timeMemory
1246467rhombusFeast (NOI19_feast)C++20
0 / 100
1094 ms35136 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define int long long 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]); } if (lambda + x + dp[i - 1][1] > dp[i][1]) { dp[i][1] = lambda + x + dp[i - 1][1]; mn[i][1] = mn[i - 1][1] + 1; } else if (lambda + x + dp[i - 1][1] == dp[i][1]) { mn[i][1] = min(mn[i][1], 1 + mn[i- 1][1]); } } 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; } int32_t 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 = 0; while (l <= r) { ll mid = (l + r) / 2; if (calc(a, mid).second <= k) { l = mid + 1; } else { r = mid - 1; } } l = -1e12 - 7; while (r - l > 3) { ll mid1 = l + (r - l) / 3; ll mid2 = r - (r - l) / 3; ll score1 = calc(a, mid1).first - calc(a, mid1).second * (ll) mid1; ll score2 = calc(a, mid2).first - calc(a, mid2).second * (ll) mid2; if (score1 <= score2) { l = mid1; } else { r = mid2; } } ll score = -inf * (ll) n; for (int i = l; i <= r; i++) { score = max(score, calc(a, i).first - calc(a, i).second * (ll) i); } cout << 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...