Submission #603416

#TimeUsernameProblemLanguageResultExecution timeMemory
603416Red_InsideCounting Mushrooms (IOI20_mushrooms)C++17
25 / 100
135 ms780 KiB

#include "mushrooms.h"
#include <bits/stdc++.h>

#define ll long long
#define f first
#define s second
#define pb push_back
#define mp make_pair
#define o cout<<"BUG"<<endl;
#define FOR(i, j, n) for(int j = i; j < n; ++j)
#define forn(i, j, n) for(int j = i; j <= n; ++j)
#define nfor(i, j, n) for(int j = n; j >= i; --j)
#define all(v) v.begin(), v.end()
#define ld long double
#define ull unsigned long long

using namespace std;
const int maxn=2e5+100,LOG=17,mod=1e9+7;
int block = 226, timer = 0;
const ld EPS = 1e-18;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);

#define bt(i) (1 << (i))
//#define int ll
const int inf=2e9;
#define y1 yy
#define prev pre
#define pii pair <int, int>

int count_mushrooms(int n)
{
	vector <int> was, fi, se, que;
	int ret = 0;
	was.assign(n + 2, 0);
	was[0] = 1;
	fi.pb(0);
	que.clear();
	que.pb(0);
	que.pb(1);
	ret = use_machine(que);
	if(ret == 1)
	{
		was[1] = 2;
		se.pb(1);
	}
	else
	{
		was[1] = 1;
		fi.pb(1);
	}
	que.clear();
	if(n <= 2)
	{
		return fi.size();
	}
	que.pb(0);
	que.pb(2);
	ret = use_machine(que);
	if(ret == 1)
	{
		was[2] = 2;
		se.pb(2);
	}
	else
	{
		was[2] = 1;
		fi.pb(2);
	}
	for(int iter = 1; iter * 2 - 1 <= n-3; ++iter)
	{
		int pos = rng() % n;
		while(was[pos]) pos = rng() % n;
		if(n - 3 == 2*iter- 1)
		{
			que.clear();
			que.pb(0);
			que.pb(pos);
			ret = use_machine(que);
			if(ret == 1)
			{
				was[pos] = 2;
				se.pb(pos);
			}
			else
			{
				was[pos] = 1;
				fi.pb(pos);
			}
			break;
		}
		was[pos] = 1;
		int pos2 = rng() % n;
		while(was[pos2]) pos2 = rng() % n;
		if(fi.size() >= 2)
		{
			que.clear();
			que.pb(fi[0]);
			que.pb(pos);
			que.pb(fi[1]);
			que.pb(pos2);
			ret = use_machine(que);
			if(ret % 2 == 1)
			{
				was[pos2] = 2;
				se.pb(pos2);
			}
			else
			{
				was[pos2] = 1;
				fi.pb(pos2);
			}
			if(ret / 2 == 1)
			{
				was[pos] = 2;
				se.pb(pos);
			}
			else
			{
				was[pos] = 1;
				fi.pb(pos);
			}
		}
		else
		{
			que.clear();
			que.pb(se[0]);
			que.pb(pos);
			que.pb(se[1]);
			que.pb(pos2);
			ret = use_machine(que);
			if(ret % 2 == 0)
			{
				was[pos2] = 2;
				se.pb(pos2);
			}
			else
			{
				was[pos2] = 1;
				fi.pb(pos2);
			}
			if(ret / 2 == 0)
			{
				was[pos] = 2;
				se.pb(pos);
			}
			else
			{
				was[pos] = 1;
				fi.pb(pos);
			}
		}
	}
	int ans = fi.size();
	if(se.size() > fi.size())
	{
		while(true)
		{
			int uk = 0;
			que.clear();
			forn(0, i, n-1)
			{
				if(!was[i])
				{
					que.pb(se[uk++]);
					que.pb(i);
					if(uk == se.size()) break;
				}
			}
			if(que.size() == 0) break;
			ret = use_machine(que);
			ans += ret / 2 + ret % 2;
			for(int i = 1; i < que.size(); i += 2)
			{
				was[que[i]] = 1;
			}
		}
	}
	else
	{
		while(true)
		{
			int uk = 0;
			que.clear();
			forn(0, i, n-1)
			{
				if(!was[i])
				{
					que.pb(fi[uk++]);
					que.pb(i);
					if(uk == fi.size()) break;
				}
			}
			if(que.size() == 0) break;
			ret = use_machine(que);
			ans += ((int)que.size()) / 2 - (ret / 2 + ret % 2);
			for(int i = 1; i < que.size(); i += 2)
			{
				was[que[i]] = 1;
			}
		}
	}
	return ans;
}

Compilation message (stderr)

mushrooms.cpp: In function 'int count_mushrooms(int)':
mushrooms.cpp:168:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  168 |      if(uk == se.size()) break;
      |         ~~~^~~~~~~~~~~~
mushrooms.cpp:174:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  174 |    for(int i = 1; i < que.size(); i += 2)
      |                   ~~^~~~~~~~~~~~
mushrooms.cpp:192:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  192 |      if(uk == fi.size()) break;
      |         ~~~^~~~~~~~~~~~
mushrooms.cpp:198:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  198 |    for(int i = 1; i < que.size(); i += 2)
      |                   ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...