# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
813804 | joonwu04 | Counting Mushrooms (IOI20_mushrooms) | C++17 | 7 ms | 340 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "mushrooms.h"
#include <vector>
#include <iostream>
using namespace std;
vector<int> a, b;
int ans;
int type3(vector<int> &v);
void type2(int base1, int base2, int isA, int i, int j);
void type1(int i);
int count_mushrooms(int n) {
if(n==2) {
return 2-use_machine({0, 1});
}
//printf("printOK\n");
a.push_back(0);
type1(1);
type1(2);
//printf("pass1\n");
int k=min(n-1, 140);
k -= k%2==1 ? 1:0;
// k%2 == 0
for(int i=3; i<=k-1; i+=2) {
if(a.size()>=2) {
type2(a[0], a[1], 1, i, i+1);
}
else {
type2(b[0], b[1], 0, i, i+1);
}
}
//printf("pass2\n");
ans = a.size();
int i=k+1;
while(i<=n-1) {
int vSize = min(n-1-i+1, (int)max(a.size(), b.size()));
vector<int> v;
for(int j=0; j<vSize; j++) {
v.push_back(i+j);
}
ans += type3(v);
//printf("%d~%d pass\n", i, i+vSize-1);
i = i+vSize;
}
return ans;
}
// type3: knowing v by 1 with how many colors are red.
int type3(vector<int> &v) {
int isA = a.size() >= b.size() ? 1:0;
vector<int> &ta = isA ? a:b;
vector<int> &tb = isA ? b:a;
vector<int> tmp;
for(int i=0; i<v.size(); i++) {
tmp.push_back(ta[i]);
tmp.push_back(v[i]);
}
int x = use_machine(tmp);
if(x%2 == 0) {
ta.push_back(v.back());
}
else {
tb.push_back(v.back());
}
int numA = 0;
if(x%2 == 0) {
numA++;
numA += v.size()-1 - x/2;
}
else {
numA += v.size()-1 - (x-1)/2;
}
return isA ? numA : v.size()-numA;
}
// type2: knowing 2 by 1 with what color is. And push each of them into red or blue.
void type2(int base1, int base2, int isA, int i, int j) {
int x = use_machine({base1, i, base2, j});
vector<int> &ta = isA ? a:b;
vector<int> &tb = isA ? b:a;
if(x == 0) {
ta.push_back(i);
ta.push_back(j);
}
else if(x == 1) {
ta.push_back(i);
tb.push_back(j);
}
else if(x == 2) {
tb.push_back(i);
ta.push_back(j);
}
else {
tb.push_back(i);
tb.push_back(j);
}
}
// type1: knowing 1 by 1 with what color is. And push it into red or blue.
void type1(int i) {
if(use_machine({0, i}) == 0) {
a.push_back(i);
}
else {
b.push_back(i);
}
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |