제출 #1366314

#제출 시각아이디문제언어결과실행 시간메모리
1366314ByeWorld버섯 세기 (IOI20_mushrooms)C++20
100 / 100
2 ms448 KiB
#include "mushrooms.h"
#include <bits/stdc++.h>
#define pb push_back
using namespace std;

vector<int> a[2];
int ans = 0, nw = 1;

vector<int> m;
void ZER(){
	m.pb(a[0][0]); m.pb(nw++); m.pb(a[0][1]); m.pb(nw++);
	
	int ret = use_machine(m);
	if((ret>>1) & 1) a[1].pb(nw-2);
	else a[0].pb(nw-2);
	if(ret & 1) a[1].pb(nw-1);
	else a[0].pb(nw-1);
}
void ONE(){
	m.pb(a[1][0]); m.pb(nw++); m.pb(a[1][1]); m.pb(nw++);
	
	int ret = use_machine(m);
	if((ret>>1) & 1) a[0].pb(nw-2);
	else a[1].pb(nw-2);
	if(ret & 1) a[0].pb(nw-1);
	else a[1].pb(nw-1);
}

void pre(){
	while(nw <= 200){
		m.clear();
		// cout << nw << " nw\n";
		if(a[0].size() >= 3){
			m.pb(nw++); m.pb(a[0][0]); m.pb(nw++); m.pb(a[0][1]); m.pb(nw++); m.pb(a[0][2]);

			int ret = use_machine(m);
			if(ret & 1) a[1].pb(nw-3);
			else a[0].pb(nw-3);

			if(ret >= 4) a[1].pb(nw-1), a[1].pb(nw-2);
			else if(ret <= 1) a[0].pb(nw-1), a[0].pb(nw-2);
			else {
				m.clear();
				if(a[1].size() >= 2){
					m.pb(a[1][0]); m.pb(nw-2); m.pb(a[1][1]); 
					m.pb(a[0][0]); m.pb(nw-1); m.pb(a[0][1]); m.pb(nw++); m.pb(a[0][2]); m.pb(nw++);

					int ret = use_machine(m)-1;
					if(ret & 1) a[1].pb(nw-1);
					else a[0].pb(nw-1);
					if((ret>>1) & 1) a[1].pb(nw-2);
					else a[0].pb(nw-2);
					if((ret>>2) & 1) a[1].pb(nw-3), a[0].pb(nw-4);
					else a[0].pb(nw-3), a[1].pb(nw-4);

				} else {
					nw -= 2;
					ZER();
				}
			}

		} else if(a[1].size() >= 3){
			m.pb(nw++); m.pb(a[1][0]); m.pb(nw++); m.pb(a[1][1]); m.pb(nw++); m.pb(a[1][2]);

			int ret = use_machine(m);
			if(ret & 1) a[0].pb(nw-3);
			else a[1].pb(nw-3);

			if(ret >= 4) a[0].pb(nw-1), a[0].pb(nw-2);
			else if(ret <= 1) a[1].pb(nw-1), a[1].pb(nw-2);
			else {
				m.clear();
				if(a[0].size() >= 2){
					m.pb(a[0][0]); m.pb(nw-2); m.pb(a[0][1]); 
					m.pb(a[1][0]); m.pb(nw-1); m.pb(a[1][1]); m.pb(nw++); m.pb(a[1][2]); m.pb(nw++);

					int ret = use_machine(m)-1;
					if(ret & 1) a[0].pb(nw-1);
					else a[1].pb(nw-1);
					if((ret>>1) & 1) a[0].pb(nw-2);
					else a[1].pb(nw-2);
					if((ret>>2) & 1) a[0].pb(nw-3), a[1].pb(nw-4);
					else a[1].pb(nw-3), a[0].pb(nw-4);

				} else {
					nw -= 2;
					ZER();
				}
			}

		} else if(a[0].size() >= 2){
			ZER();

		} else if(a[1].size() >= 2){
			ONE();

		} else {
			m.pb(a[1][0]); m.pb(nw++);
			if(use_machine(m) == 1) a[0].pb(nw-1);
			else a[1].pb(nw-1);
		}
	}
}

int count_mushrooms(int N) {
	int n = N;
	a[1] = {0};

	if(n >= 300) pre();
	ans = a[1].size();

	while(nw <= n-1){
		int tot = 0; 
		vector<int> m;

		if(a[0].size() < a[1].size()){//pake a
			for(int i=0; i<a[1].size(); i++){
				m.pb(a[1][i]); m.pb(nw++); 
				tot++;

				if(nw == n) break;
			}

			int ret = use_machine(m);
			ans += tot-1-ret/2; // ret/2 = B
			if(ret%2 == 1) a[0].pb(m.back()); // ada b di depan
			else ans++, a[1].pb(m.back());

		} else {//pake b
			for(int i=0; i<a[0].size(); i++){
				m.pb(a[0][i]); m.pb(nw++); 
				tot++;

				if(nw == n) break;
			}

			int ret = use_machine(m);
			ans += ret/2; // ret/2 = A
			if(ret%2 == 1) ans++, a[1].pb(m.back()); // ada b di depan
			else a[0].pb(m.back());
				
		}
	}

	return ans;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…