Submission #1275979

#TimeUsernameProblemLanguageResultExecution timeMemory
1275979kbityFeast (NOI19_feast)C++20
100 / 100
87 ms1608 KiB
// https://oj.uz/problem/view/NOI19_feast
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
using LL=long long;
using LD=long double;
#define FOR(i,l,r) for(auto i=(l);i<=(r);++i)
#define ROF(i,l,r) for(auto i=(l);i>=(r);--i)
#define REP(i,n) FOR(i,0,(n)-1)
#define ITF(e,c) for(auto&e:(c))
#define ssize(x) int(x.size())
#ifdef DEBUG
auto operator<<(auto&o,auto p)->decltype(p.first,o){return o<<'('<<p.first<<", "<<p.second<<')';}
auto operator<<(auto&o,auto&x)->decltype(x.end(),o){o<<'{';int i=0;for(auto e:x)o<<(", ")+2*!i++<<e;return o<<'}';}
#define debug(x...) cerr<<"["#x"]: ",[](auto...$){((cerr<<$<<"; "),...);}(x),cerr<<'\n'
#else
#define debug(...) {}
#endif

int N,K;
vector<int> A;

// calculates dp for λ
pair<LL,int> calc(LL lambda) {
  static array<array<pair<LL,int>,2>,2> dp;
  dp[0][0] = {0,0}, dp[0][1] = {A[0] - lambda,1};
  FOR(i,1,N-1) {
    // skip
    dp[1][0] = max(dp[0][0], dp[0][1]);

    // take
    dp[1][1] = max(
      pair{dp[0][0].first + A[i] - lambda, dp[0][0].second + 1},
      pair{dp[0][1].first + A[i], dp[0][1].second}
    );

    debug(lambda,i,dp[1]);

    // next
    swap(dp[0],dp[1]);
  }

  return max(dp[0][0], dp[0][1]);
}

int main() {
  cin.tie(0)->sync_with_stdio(0);

  /// input
  {
    cin >> N >> K;
    A.resize(N);
    ITF(e,A) cin >> e;
  }

  /// algo
  LL aL;
  {
    // #warning change this bitch
    LL low = 0, high = 1e18, mid;
    while(low < high) {
      mid = (low + high + 1) / 2;
      auto [v,c] = calc(mid);
      debug(low,mid,high,v,c);
      if (c < K) high = mid - 1;
      else low = mid;
    }
    aL = low;
    debug(aL);
  }

  /// output
  {
    cout << calc(aL).first + K*aL << endl;
  }

  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...