제출 #1290477

#제출 시각아이디문제언어결과실행 시간메모리
1290477MinhKienFeast (NOI19_feast)C++20
100 / 100
93 ms9836 KiB
#include <iostream> using namespace std; #define ll long long const int N = 3e5 + 10; int n, k, MinPre, it[N], f[N][2], F; ll a[N], dp[N][2], DP; void dodp(ll delta) { dp[1][0] = 0; dp[1][1] = a[1] - delta; f[1][1] = 1; for (int i = 2; i <= n; ++i) { if (dp[i - 1][0] + a[i] - delta > dp[i - 1][1] + a[i]) { dp[i][1] = dp[i - 1][0] + a[i] - delta; f[i][1] = f[i - 1][0] + 1; } else { dp[i][1] = dp[i - 1][1] + a[i]; f[i][1] = f[i - 1][1]; } if (dp[i - 1][0] > dp[i - 1][1]) { dp[i][0] = dp[i - 1][0]; f[i][0] = f[i - 1][0]; } else { dp[i][0] = dp[i - 1][1]; f[i][0] = f[i - 1][1]; } } if (dp[n][1] > dp[n][0]) { DP = dp[n][1]; F = f[n][1]; } else { DP = dp[n][0]; F = f[n][0]; } } int main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(false); cin >> n >> k; for (int i = 1; i <= n; ++i) { cin >> a[i]; } ll l = 0, r = 1e12, ans = l; while (l <= r) { ll mid = (l + r) >> 1; dodp(mid); if (F <= k) { r = mid - 1; ans = mid; } else { l = mid + 1; } } dodp(ans); cout << max(0ll, DP + (ll)F * ans) << "\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...