Submission #1203662

#TimeUsernameProblemLanguageResultExecution timeMemory
1203662LucaLucaMCounting Mushrooms (IOI20_mushrooms)C++20
80.71 / 100
3 ms468 KiB
#include "mushrooms.h"
#include <vector>
#include <algorithm>
#include <cassert>
#include <iostream>
#include <random>

std::mt19937 rng(123);

int calcK(int n) {
  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;
    } 
  }
  return K;
}

int count_mushrooms(int n) {
  std::vector<int> A, B;
  A.push_back(0);
  int cntA = 0;
  for (int i = 1; i < n;) {
    int addI = std::max((int) A.size(), (int) B.size());
    if (A.size() > B.size()) { // xAyAzA
      std::vector<int> query;
      for (int k = 0; k < (int) A.size() && i + k < n; k++) {
        query.push_back(i + k);
        query.push_back(A[k]);
      }
      int aux = use_machine(query);
      // aux % 2 imi spune despre prima valoare daca e B(1) sau A(0)
      // hai sa iau un ex
      // bAaAaAbAbAaA (are lungime 12)
      // fiecare a imi da +0
      // fiecare b imi da +2, mai putin primul care imi da +1
      // 2 * 2 + 1 = 5 de la b uri
      // primesc rezultatul 5
      // eu zic ca am 12 / 2 - 5 / 2 - 1 = 6 - 2 - 1 = 4 - 1 = 3 a uri (sper ca e bine)
      if (aux % 2 == 0) {
        A.push_back(i);
      } else {
        B.push_back(i);
      }

      aux -= aux % 2; // practic am sters primul element
  
      int sz = (int) query.size() - 2;
      // x * (sz / 2)
      // bs * 2 == aux
      // as + bs = sz / 2
      // 2 * as + aux == sz 
      // as = (sz - aux) / 2 
      // asta pare bine
      cntA += sz / 2 - aux / 2;
    } else { // xByBzB
      std::vector<int> query;
      for (int k = 0; k < (int) B.size() && i + k < n; k++) {
        query.push_back(i + k);
        query.push_back(B[k]);
      }
      int aux = use_machine(query);
      if (aux % 2 == 0) {
        B.push_back(i);
      } else {
        A.push_back(i);
      }  

      aux -= aux % 2; // practic am sters primul element
      cntA += aux / 2;
    }
    i += addI;
  }
  return cntA + (int) A.size();
}
#Verdict Execution timeMemoryGrader output
Fetching results...