Submission #304796

#TimeUsernameProblemLanguageResultExecution timeMemory
304796FdgCounting Mushrooms (IOI20_mushrooms)C++14
100 / 100
10 ms768 KiB
#include <iostream> #include <vector> #include <map> #include <set> #include <algorithm> #include "mushrooms.h" using namespace std; const int VAL = 100; vector<int> a, b; void process(int x, bool isA) { if (isA) a.push_back(x); else b.push_back(x); } int count_mushrooms(int n) { a.clear(); b.clear(); vector<int> v; for (int i = 1; i < n; ++i) v.push_back(i); int ans = 0, pos = 0; a.push_back(0); while (a.size() < VAL && b.size() < VAL && pos + 5 <= (int) v.size()) { if (a.size() > 2 && b.size() > 1) { vector<int> arr; arr.push_back(a[0]); arr.push_back(v[pos]), ++pos; arr.push_back(a[1]); arr.push_back(v[pos]), ++pos; arr.push_back(a[2]); arr.push_back(v[pos]), ++pos; int ret = use_machine(arr); if (ret == 5) { process(arr[1], false); process(arr[3], false); process(arr[5], false); } else if (ret == 4) { process(arr[1], false); process(arr[3], false); process(arr[5], true); } else if (ret == 3) { process(arr[5], false); vector<int> nArr = {b[1], arr[1], b[0], a[0], arr[3], a[1]}; nArr.push_back(v[pos]), ++pos; nArr.push_back(a[2]); nArr.push_back(v[pos]), ++pos; int cur = use_machine(nArr) - 1; process(arr[1], (cur & 4)); process(arr[3], !(cur & 4)); process(nArr[6], !(cur & 2)); process(nArr[8], !(cur & 1)); } else if (ret == 2) { process(arr[5], true); vector<int> nArr = {b[1], arr[1], b[0], a[0], arr[3], a[1]}; nArr.push_back(v[pos]), ++pos; nArr.push_back(a[2]); nArr.push_back(v[pos]), ++pos; int cur = use_machine(nArr) - 1; process(arr[1], (cur & 4)); process(arr[3], !(cur & 4)); process(nArr[6], !(cur & 2)); process(nArr[8], !(cur & 1)); } else if (ret == 1) { process(arr[1], true); process(arr[3], true); process(arr[5], false); } else { process(arr[1], true); process(arr[3], true); process(arr[5], true); } } else if (b.size() > 2 && a.size() > 1) { vector<int> arr; arr.push_back(b[0]); arr.push_back(v[pos]), ++pos; arr.push_back(b[1]); arr.push_back(v[pos]), ++pos; arr.push_back(b[2]); arr.push_back(v[pos]), ++pos; int ret = use_machine(arr); if (ret == 5) { process(arr[1], true); process(arr[3], true); process(arr[5], true); } else if (ret == 4) { process(arr[1], true); process(arr[3], true); process(arr[5], false); } else if (ret == 3) { process(arr[5], true); vector<int> nArr = {a[1], arr[1], a[0], b[0], arr[3], b[1]}; nArr.push_back(v[pos]), ++pos; nArr.push_back(b[2]); nArr.push_back(v[pos]), ++pos; int cur = use_machine(nArr) - 1; process(arr[1], !(cur & 4)); process(arr[3], (cur & 4)); process(nArr[6], (cur & 2)); process(nArr[8], (cur & 1)); } else if (ret == 2) { process(arr[5], false); vector<int> nArr = {a[1], arr[1], a[0], b[0], arr[3], b[1]}; nArr.push_back(v[pos]), ++pos; nArr.push_back(b[2]); nArr.push_back(v[pos]), ++pos; int cur = use_machine(nArr) - 1; process(arr[1], !(cur & 4)); process(arr[3], (cur & 4)); process(nArr[6], (cur & 2)); process(nArr[8], (cur & 1)); } else if (ret == 1) { process(arr[1], false); process(arr[3], false); process(arr[5], true); } else { process(arr[1], false); process(arr[3], false); process(arr[5], false); } } else if (a.size() > 1) { vector<int> arr; arr.push_back(v[pos]), ++pos; arr.push_back(a[0]); arr.push_back(v[pos]), ++pos; arr.push_back(a[1]); int ret = use_machine(arr); if (ret == 3) { process(arr[0], false); process(arr[2], false); } else if (ret == 2) { process(arr[0], true); process(arr[2], false); } else if (ret == 1) { process(arr[0], false); process(arr[2], true); } else { process(arr[0], true); process(arr[2], true); } } else if (b.size() > 1) { vector<int> arr; arr.push_back(v[pos]), ++pos; arr.push_back(b[0]); arr.push_back(v[pos]), ++pos; arr.push_back(b[1]); int ret = use_machine(arr); if (ret == 3) { process(arr[0], true); process(arr[2], true); } else if (ret == 2) { process(arr[0], false); process(arr[2], true); } else if (ret == 1) { process(arr[0], true); process(arr[2], false); } else { process(arr[0], false); process(arr[2], false); } } else { vector<int> arr = {a[0]}; arr.push_back(v[pos]), ++pos; int ret = use_machine(arr); if (ret & 1) { process(arr[1], false); } else { process(arr[1], true); } } } ans = a.size(); while (pos < (int) v.size()) { if (a.size() >= b.size()) { vector<int> arr; int used = 0; for (int i = 0; i < (int) a.size(); ++i) { arr.push_back(a[i]); if (pos < (int) v.size()) { arr.push_back(v[pos]), ++pos; ++used; } else break; } int ret = use_machine(arr); int diff = (ret / 2) + (ret & 1); ans += used - diff; if (ret & 1) { b.push_back(arr.back()); } else { a.push_back(arr.back()); } } else { vector<int> arr; int used = 0; for (int i = 0; i < (int) b.size(); ++i) { arr.push_back(b[i]); if (pos < (int) v.size()) { arr.push_back(v[pos]), ++pos; ++used; } else break; } int ret = use_machine(arr); int diff = (ret / 2) + (ret & 1); ans += diff; if (ret & 1) { a.push_back(arr.back()); } else { b.push_back(arr.back()); } } } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...