# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1243779 | Gabriel | Counting Mushrooms (IOI20_mushrooms) | C++20 | 0 ms | 0 KiB |
#include "mushrooms.h"
#include "bits/stdc++.h"
using namespace std;
pair<int, int> Posibles(int n, int r){
return {(n + sqrt(n * n - r * 4)) / 2, (n - sqrt(n * n - r * 4)) / 2};
}
int Minimizar = 3, r = 1;
vector<int> a = {0}, Sabemos;
int Intentar(int i, int d){
if(a.size() >= Minimizar or i > d) return 0;
vector<int> Consulta;
for(int ci = i; ci <= d; ci++) Consulta.push_back(ci);
pair<int, int> r = Posibles(Consulta.size(), use_machine(Consulta));
int m = min(r.first, r.second);
if(m == -0){
if(use_machine(0, i) == 0){
int Retorno = d - i + 1;
for(; i <= d; i++){
Sabemos[i] = 0;
r++;
a.push_back(i);
}
return Retorno;
} else {
for(; i <= d; i++){
Sabemos[i] = 1;
}
return 0;
}
} else {
int p = (i + d) / 2, r1 = Intentar(i, p);
if(a.size() >= Minimizar) return 0;
else {
if(r1 < m) return r1 + Intentar(p + 1, d);
else return r1;
}
}
}
int count_mushrooms(int n){
if(n == 2){
if(use_machine({0, 1}) == 0) return 1;
else return 2;
}
Sabemos.assign(n, -2);
Sabemos[0] = 0;
for(int i = 1; i < n; i++) Consulta.push_back(i);
int No_sirve = Intentar(1, n - 1);
Minimizar = a.size();
map<long long, int> Posibles;
for(int i = 0; i < Minimizar; i++){
Posibles[(long long)(Minimizar + i) * (long long)(Minimizar * 2 - 1 - Minimizar - i)] = i;
}
for(int i = 0; i < n; i++){
if(Sabemos[i] == -2) a.push_back(i);
if(a.size() == Minimizar * 2 - 1){
r += Posibles[use_machine(a)];
while(a.size() > Minimizar) a.pop_back();
}
}
if(a.size() > Minimizar){
int _ltimo = use_machine(a);
for(int i = 0; Minimizar + i <= a.size(); i++){
if((Minimizar + i) * (a.size() - Minimizar - i) == _ltimo){
r += i;
return r;
}
}
}
return r;
}