Submission #1171991

#TimeUsernameProblemLanguageResultExecution timeMemory
1171991dmitryAdamsFeast (NOI19_feast)C++20
30 / 100
395 ms33164 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;
const int INF = 1e36;
using int128_t = __int128_t;
vector<vector<pair<int128_t, int128_t>>> dp;
pair<int128_t, int128_t> check(int 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){
      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]);
}
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;
   int l = -1e16, r = 100;
   while(r - l > 1){
      int m = (r + l) / 2;
      if(-check(m).second >= k){
         r = m;
      } else {
         l = m;
      }
   }
   cout << (int)(check(r).first + r * check(r).second) << '\n';
   return 0;
}

Compilation message (stderr)

feast.cpp:7:17: warning: overflow in conversion from 'double' to 'long long int' changes value from '1.0e+36' to '9223372036854775807' [-Woverflow]
    7 | const int INF = 1e36;
      |                 ^~~~
#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...