Submission #1186699

#TimeUsernameProblemLanguageResultExecution timeMemory
1186699hengliaoCounting Mushrooms (IOI20_mushrooms)C++20
56.93 / 100
4 ms680 KiB
#include "mushrooms.h"
#include<bits/stdc++.h>
using namespace std;

#define F first
#define S second
#define vll vector<ll>
#define pll pair<ll, ll>
#define pb push_back

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

typedef int ll;

const ll B=100;

int count_mushrooms(int n) {
	ll cnt[2]={};
	ll ans[2]={};
	vll dumb(n-1);
	for(ll i=0;i<n-1;i++){
		dumb[i]=i+1;
	}
	shuffle(dumb.begin(), dumb.end(), rng);
	vll ord;
	ord.pb(0);
	for(auto &it:dumb){
		ord.pb(it);
	}
	array<vll, 2> v;
	v[0].pb(0);
	cnt[0]++;
	ans[0]++;
	for(ll i=1;i<n && i<2*B;i++){
		vll tep;
		tep.pb(0);
		tep.pb(ord[i]);
		ll re=use_machine(tep);
		cnt[re]++;
		ans[re]++;
		v[re].pb(ord[i]);
	}
	if(2*B>=n){
		return cnt[0];
	}
	if(cnt[0]>=cnt[1]){
		ll pt=2*B;
		while(pt<n){
			vll tep;
			ll cur=0;
			for(ll rep=0;rep<cnt[0];rep++){
				tep.pb(v[0][rep]);
				if(pt<n){
					tep.pb(ord[pt]);
					pt++;
					cur++;
				}
			}
			ll re=use_machine(tep);
			ll tep2=(re+1)/2;
			ans[1]+=tep2;
			ans[0]+=cur-tep2;
		}
		return ans[0];
	}	
	else{
		ll pt=2*B;
		while(pt<n){
			vll tep;
			ll cur=0;
			for(ll rep=0;rep<cnt[1];rep++){
				tep.pb(v[1][rep]);
				if(pt<n){
					tep.pb(ord[pt]);
					pt++;
					cur++;
				}
			}
			ll re=use_machine(tep);
			ll tep2=(re+1)/2;
			ans[0]+=tep2;
			ans[1]+=cur-tep2;
		}
		return ans[0];
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...