Submission #882291

#TimeUsernameProblemLanguageResultExecution timeMemory
882291pirhosigCounting Mushrooms (IOI20_mushrooms)C++17
89.33 / 100
6 ms876 KiB
#include <bits/stdc++.h>
#include "mushrooms.h"
#define  R(a) for (int i = 0; i < a; ++i)
#define RR(a) for (int j = 0; j < a; ++j)
using namespace std;



int count_mushrooms(int n)
{
	if (n < 200)
	{
		int tot = 1;
		for (int i = 1; i < n; ++i)
		{
			tot += 1 - use_machine({0, i});
		}
		return tot;
	}

	vector<int> ta;
	vector<int> tb;
	ta.push_back(0);

	R(2)
	{
		if (use_machine({0, i + 1})) tb.push_back(i + 1);
		else ta.push_back(i + 1);
	}

	int up = 3;

	R(40)
	{
		int n1 = up++;
		int n2 = up++;
		if (ta.size() > tb.size())
		{
			int qres = use_machine({ta[0], n1, ta[1], n2});
			if (qres / 2) tb.push_back(n1);
			else ta.push_back(n1);
			if (qres % 2) tb.push_back(n2);
			else ta.push_back(n2);
		}
		else
		{
			int qres = use_machine({tb[0], n1, tb[1], n2});
			if (qres / 2) ta.push_back(n1);
			else tb.push_back(n1);
			if (qres % 2) ta.push_back(n2);
			else tb.push_back(n2);
		}
	}

	int tot = 0;

	while (up < n)
	{
		int rem = n - up;
		int s1 = ta.size();
		int s2 = tb.size();
		if (s1 > s2)
		{
			vector<int> query;
			int qs = min(rem, s1);
			R(qs * 2)
			{
				if (i % 2) query.push_back(up++);
				else query.push_back(ta[i / 2]);
			}
			int qres = use_machine(query);
			if (qres % 2) tb.push_back(up - 1);
			else ta.push_back(up - 1);
			tot += qs - 1 - (qres / 2);
		}
		else
		{
			vector<int> query;
			int qs = min(rem, s2);
			R(qs * 2)
			{
				if (i % 2) query.push_back(up++);
				else query.push_back(tb[i / 2]);
			}
			int qres = use_machine(query);
			if (qres % 2) ta.push_back(up - 1);
			else tb.push_back(up - 1);
			tot += qres / 2;
		}
	}

	return tot + ta.size();
}

#Verdict Execution timeMemoryGrader output
Fetching results...