제출 #1230633

#제출 시각아이디문제언어결과실행 시간메모리
1230633clemmy14버섯 세기 (IOI20_mushrooms)C++20
53.55 / 100
3 ms436 KiB
#include<bits/stdc++.h>
#include "mushrooms.h"
using namespace std;

// int firstTrue(int lo, int hi) {
// 	hi++;
// 	while(lo < hi) {
// 		int mid = lo+(hi-lo)/2;
// 		if(lo == mid) return lo+1;
// 		vector<int> cur;
// 		for(int i=lo; i<=mid; i++) cur.push_back(i);
// 		int nbAdj=use_machine(cur);
// 		if(nbAdj >= 1) hi=mid;
// 		else if(nbAdj == hi-lo) return lo+1;
// 		else lo=mid;
// 	}
// 	return lo+1;
// }


int count_mushrooms(int n) {
	vector<int> a={0}, b;
	// int lo=0;
	// bool aa=true;
	// while(lo != n) {
	// 	int lolo=firstTrue(lo, n-1);
	// 	if(aa) for(int i=lo; i<lolo; i++) a.push_back(i);
	// 	else for(int i=lo; i<lolo; i++) b.push_back(i);
	// 	lo=lolo;
	// 	aa=!aa;
	// 	if(a.size() > sqrt(n) || b.size() > sqrt(n)) break;
	// }
	int lo=2*sqrt(n);
	for(int i=1; i<lo; i++) {
		if(use_machine({0, i}) == 1) b.push_back(i);
		else a.push_back(i);
	}
	int ans=0;
	if(a.size() >= sqrt(n)) {
		set<int> s;
		for(auto x : a) s.insert(x);
		ans=a.size();

		// for(auto x : a) cout << x << ' ';
		// cout << endl;

		for(int i=lo; i<n; i++) {
			vector<int> cur={a[0]};
			int idx=1;
			while(idx < a.size() && i < n) {
				if(s.count(i)) {
					i++; continue;
				}
				cur.push_back(i);
				cur.push_back(a[idx]);
				idx++; i++;
			}
			if(cur.size() == 1) continue;
			// for(auto x : cur) cout << x << ' ';
			// cout << endl;
			ans+=(cur.size()-use_machine(cur))/2;
			i--;
		}
	} else {
		set<int> s;
		for(auto x : b) s.insert(x);
		ans=b.size();
	
		// for(auto x : b) cout << x << ' ';
		// cout << endl;

		for(int i=lo; i<n; i++) {
			vector<int> cur={b[0]};
			int idx=1;
			while(idx < b.size() && i < n) {
				if(s.count(i)) {
					i++; continue;
				}
				cur.push_back(i);
				cur.push_back(b[idx]);
				idx++; i++;
			}
			if(cur.size() == 1) continue;
			// for(auto x : cur) cout << x << ' ';
			// cout << endl;
			ans+=(cur.size()-use_machine(cur))/2;
			i--;
		}
		ans=n-ans;
	}
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...