| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 434800 | rqi | Cat in a tree (BOI17_catinatree) | C++14 | 0 ms | 0 KiB | 
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "mushrooms.h"
#include <bits/stdc++.h>
using namespace std;
typedef vector<int> vi;
typedef long double db;
#define pb push_back
#define bk back()
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
mt19937 rng(127);
int count_mushrooms(int n) {
	// cout << fixed << setprecision(6);
	// cout << db(226*100)/(db(98.0)) << "\n";
	vi known[2];
	vi untested;
	int ans = 1;
	known[0].pb(0);
	for(int i = 1; i < n; i++){
		untested.pb(i);
	}
	shuffle(all(untested), rng);
	const int BLOCK = sqrt(n)/2;
	vi p = vi{0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0};
	while(sz(untested)){
		int better_ind = 0;
		if(sz(known[1]) > sz(known[0])) better_ind = 1;
		if(sz(known[better_ind]) < 2 || sz(known[better_ind]) > BLOCK){
			// cout << "known: " << sz(known[better_ind]) << "\n";
			// cout << "untested: " << sz(untested) << "\n";
			vi to_test;
			int to_go = sz(untested);
			int special = untested.bk; untested.pop_back();
			to_test.pb(special);
			to_test.pb(known[better_ind][0]);
			vi tested;
			
			for(int i = 1; i < min(to_go, sz(known[better_ind])); i++){
				tested.pb(untested.bk);
				to_test.pb(untested.bk); untested.pop_back();
				to_test.pb(known[better_ind][i]);
			}
			bool do_special = 0;
			if(sz(untested) > 0){
				do_special = 1;
			}
			int res = use_machine(to_test);
			int special_identity = better_ind;
			if(res % 2 == 0){
			}
			else{
				special_identity^=1;
				
			}
			known[special_identity].pb(special);
			if(special_identity == 0){
				ans++;
			}
			// cout << res/2 << " " << sz(tested) << "\n";
			if(res/2 == sz(tested)){
				for(auto u: tested){
					known[better_ind^1].pb(u);
				}
			}
			else if(res/2 == 0){
				for(auto u: tested){
					known[better_ind].pb(u);
				}
			}
			if(better_ind == 0){
				ans+=sz(tested)-res/2;
			}
			else{
				ans+=res/2;
			}
		}
		else{
			vi tested;
			for(int i = 0; i < 2; i++){
				tested.pb(untested.bk); untested.pop_back();
			}
			vi to_test = vi{tested[0], known[better_ind][0], tested[1], known[better_ind][1]};
			int res = use_machine(to_test);
			for(int i = 0; i < 2; i++){
				int special_ind = better_ind;
				if((res>>i)&1){
					special_ind = better_ind^1;
					
				}
				else{
				}
				known[special_ind].pb(tested[i]);
			}
		}
		// else{
		// 	cout << "DOING SPECIAL" << "\n";
		// 	vi to_test;
		// 	vi tested;
		// 	cout << "sz(known[better_ind]):" << " " << sz(known[better_ind]) << "\n";
		// 	cout << "sz(untested): " << sz(untested) << "\n";
		// 	int to_go = sz(untested);
		// 	for(int i = 0; i < min(to_go, 2*sz(known[better_ind])); i++){
		// 		tested.pb(untested.bk); untested.pop_back();
		// 	}
			
		// 	cout << "tested: ";
		// 	for(auto u: tested){
		// 		cout << u << " ";
		// 	}
		// 	cout << "\n";
		// 	for(auto u: tested){
		// 		cout << p[u] << " ";
		// 	}
		// 	cout << "\n";
		// 	to_test.pb(tested[0]);
		// 	to_test.pb(known[better_ind][0]);
		// 	for(int i = 1; i+1 < sz(tested); i+=2){
		// 		to_test.pb(tested[i]);
		// 		to_test.pb(tested[i+1]);
		// 		to_test.pb(known[better_ind][(i+1)/2]);
		// 	}
		// 	if(sz(tested) % 2 == 0){
		// 		to_test.pb(tested.bk);
		// 	}
		// 	cout << "to_test: ";
		// 	for(auto u: to_test){
		// 		cout << u << " ";
		// 	}
		// 	cout << "\n";
		// 	for(auto u: to_test){
		// 		cout << p[u] << " ";
		// 	}
		// 	cout << "\n";
		// 	int res = use_machine(to_test);
		// 	cout << "res: " << res << "\n";
		// 	// cout << sz(known[better_ind]) << "\n";
		// 	// cout << res/2 << " " << sz(tested) << "\n";
		// 	// if(res/2 == sz(tested)){
		// 	// 	for(auto u: tested){
		// 	// 		known[better_ind^1].pb(u);
		// 	// 	}
		// 	// }
		// 	// else if(res/2 == 0){
		// 	// 	for(auto u: tested){
		// 	// 		known[better_ind].pb(u);
		// 	// 	}
		// 	// }
		// 	if(better_ind == 0){
		// 		ans+=sz(tested)-res;
		// 	}
		// 	else{
		// 		ans+=res;
		// 	}
		// }
		
	}
	return ans;
}
