Submission #1165638

#TimeUsernameProblemLanguageResultExecution timeMemory
1165638spycoderytFeast (NOI19_feast)C++20
100 / 100
189 ms12148 KiB
#include <bits/stdc++.h> #define f first #define s second #define int long long using namespace std; /* instead of enforcing K, we find the lambda that produces K, then just do cost + lambda * K */ const int N = 3e5+5; int a[N]; int32_t main() { int n,k; cin >> n >> k; for(int i = 0;i<n;i++)cin>>a[i]; auto fc = [&](int lmb) { pair<int,int> dp[n][2]; dp[0][0] = {0,0}; dp[0][1] = {a[0] - lmb,1}; for(int i = 1;i<n;i++) { dp[i][0] = max(dp[i-1][0],dp[i-1][1]); dp[i][1] = max( make_pair(dp[i-1][1].f + a[i],dp[i-1][1].s), make_pair(dp[i-1][0].f + a[i] - lmb,dp[i-1][0].s + 1) ); } return max(dp[n-1][0],dp[n-1][1]); }; int lo = 0, hi = 1e17; while(lo<hi){ int mid = (lo + 1 + hi)/2; fc(mid).s >= k ? lo = mid : hi = mid-1; } cout << fc(lo).f + lo * k; } /* cost UP, k down if k too high, then cost up (lo = mid) if k too low, then cost down (hi = mid-1) */
#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...