제출 #1292783

#제출 시각아이디문제언어결과실행 시간메모리
1292783ChuanChen버섯 세기 (IOI20_mushrooms)C++20
56.93 / 100
4 ms588 KiB
#include "mushrooms.h"
#include<bits/stdc++.h>
using namespace std;

mt19937 rng(time(NULL));
const unsigned int OPT = 100;

int ans;
vector<int> A, B;
queue<int> q;
vector<int> u;



int count_mushrooms(int n) {
	vector<int> m;
	A.push_back(0);
	u.resize(n-1);
	iota(u.begin(), u.end(), 1);
	shuffle(u.begin(), u.end(), rng);
	for (int i : u){
		q.push(i);
	} 

	while(q.size() && A.size() <= OPT && B.size() <= OPT){
		int c1 = q.front(); q.pop();
		if(q.empty()){
			int verdic = use_machine({c1, A[0]});
			if(verdic == 0) A.push_back(c1);
			else B.push_back(c1);
			break;
		}

		int c2 = q.front(); q.pop();

		int verdic = use_machine({c1, A[0], c2});
		if(verdic == 0){
			A.push_back(c1);
			A.push_back(c2);
		}
		else if(verdic == 2){
			B.push_back(c1);
			B.push_back(c2);
		}
		else{
			int verdic2 = use_machine({A[0], c1});
			if(verdic2 == 1){
				A.push_back(c2);
				B.push_back(c1);
			}
			else{
				A.push_back(c1);
				B.push_back(c2);
			} 
		}
	}

	while(!q.empty()){
		if(A.size() < B.size()){ //use B
			vector<int> m(min(2*B.size()-1, 2*q.size()+1));
			for(int i = 0; i < (int)m.size(); i+=2) m[i] = B[i/2];
			for(int i = 1; i < (int)m.size(); i+=2){
				m[i] = q.front(); q.pop();
			}
			int verdic = use_machine(m);
			ans += verdic/2;
		}
		else{
			vector<int> m(min(2*A.size()-1, 2*q.size()+1));
			for(int i = 0; i < (int)m.size(); i+=2) m[i] = A[i/2];
			for(int i = 1; i < (int)m.size(); i+=2){
				m[i] = q.front(); q.pop();
			}
			int verdic = use_machine(m);
			ans += m.size()/2-verdic/2;
		}
	}

	return A.size()+ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...