Submission #1265058

#TimeUsernameProblemLanguageResultExecution timeMemory
1265058lopkusA Difficult(y) Choice (BOI21_books)C++20
100 / 100
47 ms1600 KiB
#include <bits/stdc++.h>

#include "books.h"

using namespace std;
//
// --- Sample implementation for the task books ---
//
// To compile this program with the sample grader, place:
//     books.h books_sample.cpp sample_grader.cpp
// in a single folder and run:
//     g++ books_sample.cpp sample_grader.cpp
// in this folder.
//

void solve(int n, int k, long long a, int s) {
    // TODO implement this function
    /**
    if (skim(2) == 42) {
        impossible();
    } else {
        answer({1, 3});
    }**/
  std::vector<std::pair<int, int>> intervals;
  for(int i = 1; i + k - 1 <= n; i++) {
    intervals.push_back({i, i + k - 1});
  }
  std::map<int, long long> was, asked;
  std::function<long long(int)> ask = [&](int i) {
    if(was[i]) {
      return asked[i];
    }
    was[i] = 1;
    long long t = skim(i);
    asked[i] = t;
    return t;
  };
  std::vector<std::pair<long long, int>> v;
  std::vector<int> q(n + 1);
  for(int i = 1; i <= k; i++) {
    v.push_back({ask(i), i});
    q[i] = 1;
  }
  int l = k, r = n, ans = n;
  while(l <= r) {
    int mid = (l + r) / 2;
    if(ask(mid) >= a) {
      r = mid - 1;
      ans = mid;
    }
    else {
      l = mid + 1;
    }
  }
  for(int i = ans; i >= std::max(k + 1, ans - k - 1); i--) {
    v.push_back({ask(i), i});
  }
  ans = - 1;
  for(int mask = 0; mask < (1LL << (v.size())); mask++) {
    if(__builtin_popcount(mask) != k) {
      continue;
    }
    long long sum = 0;
    for(int i = 0; i < v.size(); i++) {
      if(mask & (1LL << i)) {
        sum += v[i].first;
      }
    }
    if(sum >= a && sum <= 2LL * a) {
      ans = mask;
      break;
    }
  }
  if(ans == - 1) {
    impossible();
  }
  else {
    std::vector<int> w;
    for(int i = 0; i < v.size(); i++) {
      if(ans & (1LL << i)) {
        w.push_back(v[i].second);
      }
    }
    answer(w);
  }
}

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