Submission #1289032

#TimeUsernameProblemLanguageResultExecution timeMemory
1289032LIATricks of the Trade (CEOI23_trade)C++17
0 / 100
65 ms6320 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define vll vector<ll>
#define pll pair<ll, ll>
#define tp tuple<ll, ll, ll>
const ll inf = 1e11;

ll ans = -inf;
ll n, k;
vll b, s;
vll pre;
void dc(ll l, ll r, ll optl, ll optr) {
  if (l == r)
    return;
  ll mid = (l + r) / 2;
  ll ans_mid = -inf, opt = optr;
  ll st = max(optl, mid), ed = optr;
  ll sum_k_best = 0;
  priority_queue<ll, vll, greater<ll>> pq;
  for (ll i = st; i <= ed; ++i) {
    ll len = i - mid + 1;
    pq.push(s[i]);
    sum_k_best += s[i];
    while (pq.size() > k) {
      ll node = pq.top();
      pq.pop();
      sum_k_best -= node;
    }
    if (len < k)
      continue;
    ll sum = pre[i] - (mid == 0 ? 0 : pre[mid - 1]);
    ll ans_i = sum_k_best - sum;
    if (ans_i > ans_mid) {
      ans_mid = ans_i;
      opt = i;
    }
  }

  ans = max(ans, ans_mid);
  dc(l, mid, optl, opt);
  dc(mid + 1, r, opt, optr);
}

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  cin >> n >> k;
  b.resize(n);
  s.resize(n);
  pre.resize(n);

  for (ll i = 0; i < n; ++i) {
    cin >> b[i];
    pre[i] = (i == 0 ? 0 : pre[i - 1]) + b[i];
  }
  for (ll i = 0; i < n; ++i)
    cin >> s[i];

  dc(0, n - 1, 0, n - 1);

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