# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
346138 | TheerapakG | 버섯 세기 (IOI20_mushrooms) | C++17 | 1 ms | 364 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "mushrooms.h"
#include <bits/stdc++.h>
using namespace std;
vector<int> vec[2];
int find_2(int i, bool add=true)
{
int use = vec[0].size()>vec[1].size()?0:1;
int ans = use_machine(vector<int>{vec[use][0], i, vec[use][1], i+1});
if(add)
{
if(ans>1) vec[!use].push_back(i);
else vec[use].push_back(i);
if(ans%2==0) vec[use].push_back(i+1);
else vec[!use].push_back(i+1);
}
if(use==0) return (4-ans)/2;
else return (ans+1)/2;
}
int count_mushrooms(int n)
{
if(n<3) return 2-use_machine({0, 1});
else
{
vec[0].push_back(0);
for(int i=1;i<3;i++) vec[use_machine({0, i})].push_back(i);
int s = vec[0].size();
int i=3;
for(;max(vec[0].size(), vec[1].size())<4&&i+1<n; i+=2) s+= find_2(i);
for(;max(vec[0].size(), vec[1].size())<100&&i+4<n; i+=5)
{
int use = vec[0].size()>vec[1].size()?0:1;
int ans_1;
vector<int> query_1;
for(int j=0; j<5; j++)
{
query_1.push_back(vec[use][j]);
query_1.push_back(i+j);
}
ans_1 = use_machine(query_1);
if(ans_1%2==0) vec[use].push_back(i+4); // last one is same
else vec[!use].push_back(i+4); // last one is NOT same
if(use==0) s+= (10-ans_1)/2;
else s+= (ans_1+1)/2;
if(ans_1<2) for(int j=0; j<4; j++) vec[use].push_back(i+j);
else if (ans_1>7) for(int j=0; j<4; j++) vec[!use].push_back(i+j);
else
{
int sim = ans_1/2;
int ans_2 = find_2(i);
sim -= ans_2;
if(sim == 0)
{
vec[!use].push_back(i+2);
vec[!use].push_back(i+3);
}
else if(sim == 2)
{
vec[use].push_back(i+2);
vec[use].push_back(i+3);
}
else find_2(i+2);
}
}
while(i<n)
{
int use = vec[0].size()>vec[1].size()?0:1;
vector<int> query;
for(auto it=vec[use].begin(); i<n&&it!=vec[use].end(); i++, it++)
{
query.push_back(*it);
query.push_back(i);
}
int ans = use_machine(query);
if(ans%2==0) vec[use].push_back(i-1); // last one is same
else vec[!use].push_back(i-1); // last one is NOT same
if(use==0) s+= (query.size()-ans)/2;
else s+= (ans+1)/2;
}
return s;
}
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |