Submission #970423

#TimeUsernameProblemLanguageResultExecution timeMemory
970423AisteSFeast (NOI19_feast)C++14
100 / 100
148 ms15216 KiB
//2019 NOI (National Olympiad of Singapore) //Lagrangian Relaxation algorithm #include<bits/stdc++.h> using namespace std; #define int int64_t #define pii pair<int, int> #define f first #define s second const int maxn = 3e5 + 5; pii dp[maxn][2]; int A[maxn]; int N, K; pii check(int lambda) { dp[0][0] = {0, 0}; dp[0][1] = {A[0] - lambda, 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].first + A[i], dp[i - 1][1].s), make_pair(dp[i - 1][0].f - lambda + A[i], dp[i - 1][0].s + 1)); //cout << i << " " << dp[i][0].f << " " << dp[i][1].f << endl; } return max(dp[N - 1][0], dp[N - 1][1]); } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> N >> K; for (int i = 0; i < N; i++) cin >> A[i]; //cout << check(2).f << " bum\n"; //find lambda int lo = 0, hi = 1e18; while(lo < hi) { int mid = (hi + lo + 1) / 2; //cout << mid <<endl; auto smth = check(mid); //cout << smth.f << " " << smth.s <<endl; if (smth.s >= K) lo = mid; else hi = mid - 1; } //cout << lo <<endl; cout << check(lo).f + lo * K; } /* 6 1 1 -2 3 -1 5 -6 ans: 7 6 2 1 2 3 -10 5 6 ans: 17 6 4 -1 -2 -1 0 -5 -1 ans: 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...