Submission #1366334

#TimeUsernameProblemLanguageResultExecution timeMemory
1366334lucaskojimaA Difficult(y) Choice (BOI21_books)C++20
45 / 100
1 ms1204 KiB
#include <bits/stdc++.h>
#include "books.h"

using namespace std;

void solve(int N, int K, long long A, int S) {
  vector<long long> X(N + 1);

  auto get = [&](int i) -> long long {
    return X[i] == 0 ? X[i] = skim(i) : X[i];
  };

  if (get(1) >= A)
    impossible();

  int l = 1;     // X[l] < A
  int r = N + 1; // X[r] >= A
  while (r > l + 1) {
    int m = (l + r) / 2;
    long long x = get(m);
    if (x < A)
      l = m;
    else
      r = m;
  }

  if (l < N) {
    long long sum = get(l + 1);
    vector<int> ans{l + 1};
    for (int i = 1; i <= min(K - 1, l); i++) {
      sum += get(i);
      ans.push_back(i);
    }

    sort(ans.begin(), ans.end());
    if (A <= sum && sum <= 2 * A && int(size(ans)) == K)
      answer(ans);
  }

  set<int> ans;
  long long sum = 0;

  for (int i = 1; i <= K; i++) {
    sum += get(i);
    ans.insert(i);
  }

  for (int lx = K, rx = l; lx >= 0; lx--, rx--) {
    if (A <= sum && sum <= 2 * A) {
      vector<int> res(ans.begin(), ans.end());
      answer(res);
    }
    sum -= get(lx);
    sum += get(rx);
    ans.erase(lx);
    ans.insert(rx);
  }
  if (A <= sum && sum <= 2 * A) {
    vector<int> res(ans.begin(), ans.end());
    answer(res);
  }
  impossible();
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...