제출 #410981

#제출 시각아이디문제언어결과실행 시간메모리
410981SeDunion버섯 세기 (IOI20_mushrooms)C++17
76.87 / 100
13 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, 90); 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...