Submission #1292751

#TimeUsernameProblemLanguageResultExecution timeMemory
1292751enzyCounting Mushrooms (IOI20_mushrooms)C++20
79.58 / 100
4 ms436 KiB
#include "mushrooms.h"
#include<bits/stdc++.h>
using namespace std;
const int sqt=144;
int solve(int n){
	int resp=0;
	vector<int>a, b;
	a.push_back(0);
	int id=1;
	while(max(a.size(),b.size())<=sqt&&id<n){
		vector<int>aux;
		aux.push_back(0); aux.push_back(id);
		if(use_machine(aux)) b.push_back(id);
		else a.push_back(id);
		id++;
	}
	resp=a.size();
	if(a.size()>=sqt){
		//cout << "A" << endl;
		while(id<n){
			vector<int>aux;
			int qtd=0;
			for(int i=0;i<a.size()-1;i++){
				aux.push_back(a[i]);
				if(id<n){
					aux.push_back(id);
					id++;
					qtd++;
				}
			}
			aux.push_back(a.back());
			resp+=((2*qtd-use_machine(aux))/2);
		}
	}else{
		//cout << "B" << endl;
		while(id<n){
			vector<int>aux;
			int qtd=0;
			for(int i=0;i<b.size()-1;i++){
				aux.push_back(b[i]);
				if(id<n){
					aux.push_back(id);
					id++;
					qtd++;
				}
			}
			aux.push_back(b.back());
			resp+=(use_machine(aux)/2);
		}
	}
	return resp;
}
int count_mushrooms(int n){
	if(n<=500) return solve(n);
	int resp=0;
	vector<int>a, b;
	a.push_back(0);
	int id=1;
	while(max(a.size(),b.size())<=3&&id<n){
		vector<int>aux;
		aux.push_back(0); aux.push_back(id);
		if(use_machine(aux)) b.push_back(id);
		else a.push_back(id);
		id++;
	}
	if(a.size()>=3){
		while(max(a.size(),b.size())<=sqt&&id<n){
			vector<int>aux;
			aux.push_back(id); id++; 
			aux.push_back(a[0]); 
			aux.push_back(a[1]);
			aux.push_back(id); id++;
			aux.push_back(a[2]);
			int at=use_machine(aux);
			vector<int>qm={0,3};
			for(int k=0;k<2;k++){
				if(at&(1<<k)) b.push_back(aux[qm[k]]); 
				else a.push_back(aux[qm[k]]);
			}
		}
	}else{
		while(max(a.size(),b.size())<=sqt&&id<n){
			vector<int>aux;
			aux.push_back(id); id++; 
			aux.push_back(b[0]); 
			aux.push_back(b[1]);
			aux.push_back(id); id++;
			aux.push_back(b[2]);
			int at=use_machine(aux);
			vector<int>qm={0,3};
			for(int k=0;k<2;k++){
				if(at&(1<<k)) a.push_back(aux[qm[k]]); 
				else b.push_back(aux[qm[k]]);
			}
		}
	}



	// ja ta certo essa parte
	resp=a.size();
	while(id<n){
		if(a.size()>b.size()){
			vector<int>aux;
			int qtd=0;
			for(int i=0;i<a.size()-1;i++){
				aux.push_back(a[i]);
				if(id<n){
					aux.push_back(id);
					id++;
					qtd++;
				}
			}
			aux.push_back(a.back());
			resp+=((2*qtd-use_machine(aux))/2);
		}else{
			vector<int>aux;
			int qtd=0;
			for(int i=0;i<b.size()-1;i++){
				aux.push_back(b[i]);
				if(id<n){
					aux.push_back(id);
					id++;
					qtd++;
				}
			}
			aux.push_back(b.back());
			resp+=(use_machine(aux)/2);
		}
	}
	return resp;
}
#Verdict Execution timeMemoryGrader output
Fetching results...