Submission #1171975

#TimeUsernameProblemLanguageResultExecution timeMemory
1171975dmitryAdamsFeast (NOI19_feast)C++20
22 / 100
845 ms26264 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 = 1e12, INF = 1e18;
   int l = -BORDER, r = BORDER;
   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...