Submission #1171981

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