Submission #1186787

#TimeUsernameProblemLanguageResultExecution timeMemory
1186787owoovoCounting Mushrooms (IOI20_mushrooms)C++20
92.24 / 100
3 ms556 KiB
#include "mushrooms.h"
#include<bits/stdc++.h>
#define F first 
#define S second
using namespace std;
int p[20010];
int query(vector<int> vc){
	vector<int> ask=vc;
	for(auto &x:ask){
		x=p[x];
	}
	return use_machine(vc);
}
int count_mushrooms(int n) {
	for(int i=0;i<n;i++)p[i]=i;
	random_shuffle(&p[1],&p[n]);
	vector<int> a={0},b;
	if(n<=226){
		int ans=1;
		for(int i=1;i<n;i++){
			if(query({0,i})==0)ans++;
		}
		return ans;
	}
	int cnt=1;
	if(query({0,cnt})==0){
		a.push_back(cnt);
	}else{
		b.push_back(cnt);
	}
	cnt++;
	if(query({0,cnt})==0){
		a.push_back(cnt);
	}else{
		b.push_back(cnt);
	}
	cnt++;
	int T=90;
	if(a.size()>b.size()){
		for(int i=0;i<T;i++){
			int u=query({cnt,a[0],cnt+1,a[1]});
			if(u&1){
				b.push_back(cnt);
			}else{
				a.push_back(cnt);
			}
			if(u&2){
				b.push_back(cnt+1);
			}else{
				a.push_back(cnt+1);
			}
			cnt+=2;
		}
	}else{
		for(int i=0;i<T;i++){
			int u=query({cnt,b[0],cnt+1,b[1]});
			if(u&1){
				a.push_back(cnt);
			}else{
				b.push_back(cnt);
			}
			if(u&2){
				a.push_back(cnt+1);
			}else{
				b.push_back(cnt+1);
			}
			cnt+=2;
		}

	}

	int ans=a.size();
	while(cnt<n){
		vector<int> q;
		int xd=0,st=cnt;
		if(a.size()>=b.size()){
			for(int i=0;i<a.size();i++){
				if(cnt<n){
					xd++;
					q.push_back(cnt);
					cnt++;
				}
				q.push_back(a[i]);
			}
			int ct=query(q);
			if(ct%2==0){
				a.push_back(st);
			}else{
				b.push_back(st);
			}
			int bs=(ct+1)/2;
			ans+=xd-bs;
		}else{
			for(int i=0;i<b.size();i++){
				if(cnt<n){
					xd++;
					q.push_back(cnt);
					cnt++;
				}
				q.push_back(b[i]);
			}
			int ct=query(q);
			if(ct%2==0){
				b.push_back(st);
			}else{
				a.push_back(st);
			}
			int as=(ct+1)/2;
			ans+=as;
		}
	}
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...