Submission #1351846

#TimeUsernameProblemLanguageResultExecution timeMemory
1351846Jawad_Akbar_JJCounting Mushrooms (IOI20_mushrooms)C++17
79.30 / 100
3 ms580 KiB
#include <iostream>
#include <vector>
#include <chrono>
#include <random>
#include <algorithm>
#include "mushrooms.h"

using namespace std;
vector<int> v1 = {0}, v2;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());


int count_mushrooms(int n){
	vector<int> all;
	for (int i=1;i<n;i++)
		all.push_back(i);

	for (int j=1;j<=10;j++){
		for (int i=0;i<n-1;i++)
			swap(all[i], all[rng() % (n - 1)]);
	}

	for (int i : {0, 1}){
		if (all.size() == 0)
			break;

		if (use_machine({0, all.back()}) == 0)
			v1.push_back(all.back());
		else
			v2.push_back(all.back());
		all.pop_back();
	}

	int L = 3;
	for (int i=3;all.size() > 0 and i<164 * 2;i+=2){
		if (all.size() == 1){
			if (use_machine({0, all.back()}))
				v2.push_back(all.back());
			else
				v1.push_back(all.back());
			all.pop_back();
			break;
		}
		int a = all.back();
		all.pop_back();
		int b = all.back();
		all.pop_back();

		if (v1.size() > 1){
			int x = use_machine({a, v1[0], b, v1[1]});
			if ((x & 1) == 0)
				v1.push_back(a);
			else
				v2.push_back(a);
			if ((x & 2) == 0)
				v1.push_back(b);
			else
				v2.push_back(b);
		}
		else{
			int x = use_machine({a, v2[0], b, v2[1]});
			if ((x & 1) == 0)
				v2.push_back(a);
			else
				v1.push_back(a);
			if ((x & 2) == 0)
				v2.push_back(b);
			else
				v1.push_back(b);
		}
		L = i + 2;
	}

	int A = v1.size(), B = v2.size();
	for (;all.size() > 0;){
		int k = 0;
		if (v1.size() > v2.size()){
			
			vector<int> v = {v1[0]};
			for (int j=1;all.size() > 0 and j < v1.size();j++){
				v.push_back(all.back()), all.pop_back();
				v.push_back(v1[j]);
				k++;
			}
			int x = use_machine(v);
			A += k - x / 2;
		}
		else{
			vector<int> v = {v2[0]};
			for (int j=1;all.size() > 0 and j < v2.size();j++){
				v.push_back(all.back()), all.pop_back();
				v.push_back(v2[j]);
				k++;
			}
			int x = use_machine(v);
			A += x / 2;
		}
	}
	return A;

}
#Verdict Execution timeMemoryGrader output
Fetching results...