Submission #1203609

#TimeUsernameProblemLanguageResultExecution timeMemory
1203609LucaLucaMCounting Mushrooms (IOI20_mushrooms)C++20
0 / 100
0 ms424 KiB
#include "mushrooms.h"
#include <vector>
#include <algorithm>
#include <cassert>
#include <iostream>
#include <random>

std::mt19937 rng(123);

int count_mushrooms(int n) {
  std::vector<int> order(n);
  for (int i = 0; i < n; i++) {
    order[i] = i;
  }
  std::shuffle(order.begin() + 1, order.end(), rng);

  int K = 1;
  int best = 1e9;
  for (int k = 1; k <= n; k++) {
    if (3 * k / 2 + (n - 3 * k / 2) / k < best) {
      best = 3 * k / 2 + (n - 3 * k / 2) / k;
      K = k;
    } 
  }

  int i;
  std::vector<int> A, B;
  A.push_back(0);

  for (i = 1; i < (int) order.size() && (int) A.size() <= K && (int) B.size() <= K; i++) {
    if (use_machine({0, order[i]}) == 0) {
      A.push_back(order[i]); 
    } else {
      B.push_back(order[i]);  
    }
  }

  bool swapped = false;
  if (A.size() < B.size()) {
    std::swap(A, B);
    swapped = true;
  }
  
  std::vector<int> care;
  for (; i < n; i++) {
    care.push_back(order[i]);
  }
  
  int ret = !swapped? (int) A.size() : (int) B.size();

  while (!care.empty()) {
    std::vector<int> aici;
    for (int ia = 0; ia < (int) care.size() && ia < K; ia++) {
      aici.push_back(care.back());
      care.pop_back();
    }
    assert(K >= 1);
    assert((int) aici.size() >= 1);
    std::vector<int> query;
    query.push_back(A[0]);
    assert((int) aici.size() < (int) A.size());
    for (int i = 0; i < (int) aici.size(); i++) {
      query.push_back(aici[i]);
      query.push_back(A[i + 1]);
    }
    assert((int) query.size() >= 2);
    if (!swapped) {
      ret += use_machine(query) / 2;
    } else {
      ret += (int) query.size() / 2 - use_machine(query) / 2;
    }
  }
  return ret;
}
#Verdict Execution timeMemoryGrader output
Fetching results...