제출 #410985

#제출 시각아이디문제언어결과실행 시간메모리
410985SeDunion버섯 세기 (IOI20_mushrooms)C++17
80.14 / 100
12 ms656 KiB
#include "mushrooms.h"
#include<bits/stdc++.h>
using namespace std;

int K;

int askline(int l, int r) {
	vector<int>toquest;
	for (int i = l ; i <= r ; ++ i) toquest.emplace_back(i);
	return use_machine(toquest);
}

int count_mushrooms(int n) {
	K = min(n, 40);
	vector<int>who(n, 2); // 0 -> A, 1 -> B, 2 -> unknown
	who[0] = 0;
	for (int p = 0 ; p < K - 1 ; ++ p) {
		int ret = askline(p, p + 1);
		who[p + 1] = who[p] ^ (ret & 1);
	}
	array<vector<int>, 3>vecs;
	for (int i = 0 ; i < n ; ++ i) {
		vecs[who[i]].emplace_back(i);
	}
	int answer = (int)vecs[0].size();
	for (int i = 0 ; i < (int)vecs[2].size() ;) {
		auto &p = (vecs[0].size() > vecs[1].size() ? vecs[0] : vecs[1]);
		vector<int>ask;
		int l = i, r = min((int)vecs[2].size(), i + (int)p.size()) - 1;
		for (int j = l ; j <= r ; ++ j) {
			ask.emplace_back(vecs[2][j]);
			ask.emplace_back(p[j-l]);
		}
		i = r + 1;
		int ret = use_machine(ask);
		answer += (p == vecs[0] ? r-l+1 - (ret+1)/2 : (ret+1)/2);
		int first = ((p == vecs[0] && ret % 2) || (p == vecs[1] && ret % 2 == 0));
		vecs[first].emplace_back(vecs[2][l]);
	}
	return answer;
}
#Verdict Execution timeMemoryGrader output
Fetching results...