# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
730113 | danikoynov | 버섯 세기 (IOI20_mushrooms) | C++14 | 10 ms | 448 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "mushrooms.h"
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e4 + 10;
const int block = 220;
int type[maxn];
int count_mushrooms(int n)
{
vector < int > A, B;
A.push_back(0);
for (int i = 1; i < min(n, 4); i ++)
{
vector < int > tmp;
tmp.push_back(0);
tmp.push_back(i);
if (use_machine(tmp) == 0)
A.push_back(i);
else
B.push_back(i);
}
if (n <= block)
{
for (int i = 4; i < n; i ++)
{
vector < int > tmp;
tmp.push_back(0);
tmp.push_back(i);
if (use_machine(tmp) == 0)
A.push_back(i);
}
return A.size();
}
if (A.size() > 1)
{
for (int i = 4; i < min(n - 1, block); i += 2)
{
vector < int > tmp;
tmp.push_back(A[0]);
tmp.push_back(i);
tmp.push_back(A[1]);
tmp.push_back(i + 1);
int val = use_machine(tmp);
if (val % 2 == 1)
B.push_back(i + 1);
else
A.push_back(i + 1);
if (val > 1)
B.push_back(i);
else
A.push_back(i);
}
}
else
{
for (int i = 4; i < block; i += 2)
{
vector < int > tmp;
tmp.push_back(B[0]);
tmp.push_back(i);
tmp.push_back(B[1]);
tmp.push_back(i + 1);
int val = use_machine(tmp);
if (val % 2 == 1)
A.push_back(i + 1);
else
B.push_back(i + 1);
if (val > 1)
A.push_back(i);
else
B.push_back(i);
}
}
int cntA = 0, cntB = 0;
int i = block;
while(i < n)
{
int j = min(n, (int)i + (int)max(A.size(), B.size())), len = j - i;
if (A.size() > B.size())
{
vector < int > tmp;
for (int f = 0; f < len; f ++)
{
tmp.push_back(A[f]);
tmp.push_back(i + f);
}
int val = use_machine(tmp);
if (val % 2 == 1)
{
B.push_back(j - 1);
val --;
}
else
cntA ++;
///cout << len << " : " << val << endl;
cntB = cntB + val / 2;
cntA = cntA + (len - 1) - val / 2;
}
else
{
vector < int > tmp;
for (int f = 0; f < len; f ++)
{
tmp.push_back(B[f]);
tmp.push_back(i + f);
}
int val = use_machine(tmp);
if (val % 2 == 1)
{
A.push_back(j - 1);
val --;
}
else
cntB ++;
cntA = cntA + val / 2;
cntB = cntB + (len - 1) - val / 2;
}
i = j;
}
return cntA + A.size();
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |