Submission #1172004

#TimeUsernameProblemLanguageResultExecution timeMemory
1172004dmitryAdamsFeast (NOI19_feast)C++20
100 / 100
434 ms33252 KiB
#include "bits/stdc++.h" using namespace std; # define int long long # define all(a) a.begin(), a.end() vector<int> a; int n, k; using int128_t = __int128_t; const int128_t INF = 1e36; vector<vector<pair<int128_t, int128_t>>> dp; pair<int128_t, int128_t> check(int128_t x){ dp.assign(n + 1, vector<pair<int128_t, int128_t>>(2, {-INF, 0})); dp[0][1] = {0, 0}; for(int i = 1; i <= n; ++i){ auto t1 = make_pair(dp[i - 1][0].first + a[i - 1], dp[i - 1][0].second); auto t2 = make_pair(dp[i - 1][1].first + x + a[i - 1], dp[i - 1][1].second - 1); dp[i][0] = max(t1, t2); dp[i][1] = max(dp[i - 1][0], dp[i - 1][1]); } return max(dp[n][0], dp[n][1]); } signed main(){ ios::sync_with_stdio(false); cin.tie(nullptr); #ifdef LOCAL freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif cin >> n >> k; a.resize(n); for(auto &i : a) cin >> i; int128_t l = -1e18, r = 1; while(r - l > 1){ int m = (r + l) / 2; if(-check(m).second >= k){ r = m; } else { l = m; } } auto ans = check(r); ans.second = -ans.second; // cerr << (int)ans.second << '\n'; cout << (int)(ans.first - r * ans.second) << '\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...