제출 #1359558

#제출 시각아이디문제언어결과실행 시간메모리
1359558FZ_Laabidi버섯 세기 (IOI20_mushrooms)C++20
0 / 100
0 ms428 KiB
#include "mushrooms.h"
#include <bits/stdc++.h>
#include <cmath>
using namespace std;
int count_mushrooms(int n) {
	set<int> v, a;
	int q = 2*sqrt(n);
	a.insert(0);
	if(n<=225){
		int o = 1;
		for(int i=1; i<n; i++){
			o++;
			o-=use_machine({0, i});
		}
		return o;
	}
	//first part setup
	int first = use_machine({1, 0, 2});
	int touse, tovis =0;
	bool flag= true;
	if(first ==0){// AAA
		touse = 1;
		a.insert(1);
		a.insert(2);
	}
	else if(first==2) {//BAB
		touse=1; tovis = 2;
		v.insert(1);
		v.insert(2);
		flag = false;//so if usig B
	}
	else{
		first = use_machine({1, 0});
		// {1, 0, 2} givees 1
		// [1, 0] gives 1
		if(first==1){// a[1]= B
			touse = 2;
			a.insert(2);
			v.insert(1);
		}
		else{// a[1]=A
			touse = 1;
			a.insert(1);
			v.insert(2);
		} 
		
	}
	// 2 part: fid the first q
	// we have positio of 0, 1, 2
	for(int i=3; i<q-1; i+=2){
		int x = use_machine({touse, i, tovis, i+1});
		if(flag){// aka if A 
			if(x==0) {// AAAA
				a.insert(i+1);
				a.insert(i);
			}
			if(x==1){ //AAAB
				a.insert(i);
				v.insert(i+1);
			}
			if(x==2){// ABAA
				a.insert(i+1);
				v.insert(i);
			}
			if(x==3){// ABAB
				v.insert(i+1);
				v.insert(i);
			}
		
		}
		else{// if B
			if(x==0) {// AAAA
				v.insert(i+1);
				v.insert(i);
			}
			if(x==1){ //AAAB
			    v.insert(i);
				a.insert(i+1);
			}
			if(x==2){// ABAA
				v.insert(i+1);
				a.insert(i);
			}
			if(x==3){// ABAB
				a.insert(i+1);
				a.insert(i);
			}
		}	
	}
// third part do the rest
	// queryig q etters at the same time
	int vv = v.size(), aa = a.size();
	flag = (vv<=aa);
	int fac = max(vv, aa);
	int vaa = q;
	for(int i=q; i<n&& i+fac<n; i+=fac){
		vector<int> mm;
		if(flag){// usig As 
		    int vo = 0;
			for(auto it: a){
				mm.push_back(it);
				mm.push_back(vo+i);
				vo++;
			}
			int vi = use_machine(mm);
			aa+=(fac-(vi+1)/2);
		}
		else{
			int vo = 0;
			for(auto it: v){
				mm.push_back(it);
				mm.push_back(vo+i);
				vo++;
			}	
			int vi = use_machine(mm);
			aa+=(vi+1)/2;
		}
		vaa = i;
	}
	if(vaa<n){
		vector<int> mm;
		if(flag){// usig As 
		    int vo = 0;
			for(auto it: a){
				if(vo+vaa>=n)break;
				mm.push_back(it);
				mm.push_back(vo+vaa);
				vo++;
			}
			int vi = use_machine(mm);
			aa+=(fac-(vi+1)/2);
		}
		else{
			int vo = 0;
			for(auto it: v){
				if(vo+vaa>=n)break;
				mm.push_back(it);
				mm.push_back(vo+vaa);
				vo++;
			}	
			int vi = use_machine(mm);
			aa+=(vi+1)/2;
		}
	}
	return aa;
}
#Verdict Execution timeMemoryGrader output
Fetching results...