#include<bits/stdc++.h>
#include "mushrooms.h"
using namespace std;
#define ll long long
#define sz(v) ((int)(v).size())
#define all(v) (v).begin(), (v).end()
#define L(i, j, k) for(int i = (j); i <= (k); ++i)
#define R(i, j, k) for(int i = (j); i >= (k); --i)
int count_mushrooms(int n) {
vector<int> ids(n-1);
iota(all(ids),1);
reverse(all(ids));
vector<int> tipo[2];
tipo[0].clear();tipo[1].clear();
tipo[0].push_back(0);
vector<int> aux;
int resp=0;
while(!ids.empty() && sz(tipo[0])<2 && sz(tipo[1])<2){
aux.clear();
aux.push_back(0);
aux.push_back(ids.back());
int v=use_machine(aux);
tipo[v].push_back(ids.back());
ids.pop_back();
}
int at=0;
if(sz(tipo[1])==2)at=1;
int m=90;
while(sz(ids)>1 && sz(tipo[0])<m && sz(tipo[1])<m){
aux.clear();
int a=ids.back();
ids.pop_back();
int b=ids.back();
ids.pop_back();
aux={tipo[at][0],a,tipo[at][1],b};
int v=use_machine(aux);
if(v&1){//ponta eh da cor oposta
tipo[1^at].push_back(b);
}else{
tipo[at].push_back(b);
}
if(v&2){
tipo[1^at].push_back(a);
}else{
tipo[at].push_back(a);
}
}
if(sz(ids)==1){
aux.clear();
aux={0,ids.back()};
ids.pop_back();
resp+=1^use_machine(aux);
}
if(sz(ids)==0){
return resp+sz(tipo[0]);
}
at=0;
if(sz(tipo[1])>=m)at=1;
while(!ids.empty()){
int vida=sz(tipo[at])-1;
aux.clear();
while(vida>=0 && !ids.empty()){
aux.push_back(tipo[at][vida]);
aux.push_back(ids.back());
ids.pop_back();
vida--;
}
int v=use_machine(aux);
int oposto=0;
if(v&1){
v++;
oposto=1;
}
if(at==1){
resp+=v/2;
if(oposto==1){
resp--;
tipo[0].push_back(aux.back());
}
else{
tipo[1].push_back(aux.back());
}
}
else{
resp+=sz(aux)/2-v/2;
if(oposto==1){
tipo[1].push_back(aux.back());
}
else{
tipo[0].push_back(aux.back());
resp--;
}
}
if(sz(tipo[at^1])>sz(tipo[at]))at^=1;
}
return resp+sz(tipo[0]);
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |