Submission #304768

#TimeUsernameProblemLanguageResultExecution timeMemory
304768FdgCounting Mushrooms (IOI20_mushrooms)C++14
97.41 / 100
10 ms544 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, missing; map<int, vector<int>> diff, eq; set<int> found; void nextPos(const vector<int>& v, int& pos) { while (pos < (int) v.size()) { if (found.count(v[pos])) { ++pos; } else break; } } void process(int x, bool isA) { if (found.count(x)) return; found.insert(x); if (isA) a.push_back(x); else b.push_back(x); if (diff.count(x)) for (int val : diff[x]) { process(val, !isA); } if (eq.count(x)) for (int val : eq[x]) { process(val, isA); } } int count_mushrooms(int n) { a.clear(); b.clear(); diff.clear(); found.clear(); missing.clear(); srand(time(NULL)); vector<int> v; for (int i = 1; i < n; ++i) v.push_back(i); // random_shuffle(v.begin(), v.end()); int ans = 0, pos = 0; bool doNextSimple = false; double COEF = 1.2; int iter = 1; a.push_back(0); found.insert(0); while (a.size() < VAL && b.size() < VAL && pos + 10 < (int) v.size()) { if (a.size() > 2 && b.size() > 1) { vector<int> arr; nextPos(v, pos); if (pos < (int) v.size()) { arr.push_back(a[0]); arr.push_back(v[pos]), ++pos; } nextPos(v, pos); if (pos < (int) v.size()) { arr.push_back(a[1]); arr.push_back(v[pos]), ++pos; } nextPos(v, pos); if (pos < (int) v.size()) { arr.push_back(a[2]); arr.push_back(v[pos]), ++pos; } int ret = use_machine(arr); if (arr.size() == 2) { if (ret == 1) { process(arr[1], false); } else { process(arr[1], true); } } else if (arr.size() == 4) { if (ret == 3) { process(arr[1], false); process(arr[3], false); } else if (ret == 2) { process(arr[1], false); process(arr[3], true); } else if (ret == 1) { process(arr[1], true); process(arr[3], false); } else { process(arr[1], true); process(arr[3], true); } } else if (arr.size() == 6) { 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]}; nextPos(v, pos); if (pos < (int) v.size()) { nArr.push_back(v[pos]), ++pos; nArr.push_back(a[2]); } nextPos(v, pos); if (pos < (int) v.size()) { 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]}; nextPos(v, pos); if (pos < (int) v.size()) { nArr.push_back(v[pos]), ++pos; nArr.push_back(a[2]); } nextPos(v, pos); if (pos < (int) v.size()) { 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; nextPos(v, pos); if (pos < (int) v.size()) { arr.push_back(b[0]); arr.push_back(v[pos]), ++pos; } nextPos(v, pos); if (pos < (int) v.size()) { arr.push_back(b[1]); arr.push_back(v[pos]), ++pos; } nextPos(v, pos); if (pos < (int) v.size()) { arr.push_back(b[2]); arr.push_back(v[pos]), ++pos; } int ret = use_machine(arr); if (arr.size() == 2) { if (ret == 1) { process(arr[1], true); } else { process(arr[1], false); } exit(-1); } else if (arr.size() == 4) { if (ret == 3) { process(arr[1], true); process(arr[3], true); } else if (ret == 2) { process(arr[1], true); process(arr[3], false); } else if (ret == 1) { process(arr[1], false); process(arr[3], true); } else { process(arr[1], false); process(arr[3], false); } exit(-1); } else if (arr.size() == 6) { 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]}; nextPos(v, pos); if (pos < (int) v.size()) { nArr.push_back(v[pos]), ++pos; nArr.push_back(b[2]); } nextPos(v, pos); if (pos < (int) v.size()) { 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]}; nextPos(v, pos); if (pos < (int) v.size()) { nArr.push_back(v[pos]), ++pos; nArr.push_back(b[2]); } nextPos(v, pos); if (pos < (int) v.size()) { 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; nextPos(v, pos); if (pos < (int) v.size()) { arr.push_back(v[pos]), ++pos; arr.push_back(a[0]); } nextPos(v, pos); if (pos < (int) v.size()) { arr.push_back(v[pos]), ++pos; arr.push_back(a[1]); } int ret = use_machine(arr); if (arr.size() == 2) { if (ret == 1) { process(arr[0], false); } else { process(arr[0], true); } } else if (arr.size() == 4) { 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; nextPos(v, pos); if (pos < (int) v.size()) { arr.push_back(v[pos]), ++pos; arr.push_back(b[0]); } nextPos(v, pos); if (pos < (int) v.size()) { arr.push_back(v[pos]), ++pos; arr.push_back(b[1]); } int ret = use_machine(arr); if (arr.size() == 2) { if (ret == 1) { process(arr[0], true); } else { process(arr[0], false); } } else if (arr.size() == 4) { 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]}; nextPos(v, pos); if (pos < (int) v.size()) arr.push_back(v[pos]), ++pos; else break; int ret = use_machine(arr); if (ret & 1) { process(arr[1], false); } else { process(arr[1], true); } } } ans = a.size(); for (int x : missing) { if (!found.count(x)) v.push_back(x); } if (a.size() >= b.size()) { while (pos < (int) v.size()) { vector<int> arr; int used = 0; for (int i = 0; i < (int) a.size(); ++i) { arr.push_back(a[i]); nextPos(v, pos); 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 { while (pos < (int) v.size()) { vector<int> arr; int used = 0; for (int i = 0; i < (int) b.size(); ++i) { arr.push_back(b[i]); nextPos(v, pos); 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; } // int count_mushrooms(int n) { // int ans = 1; // for (int i = 1; i < n; i += 2) { // vector<int> v; // if (i + 1 < n) v = {i, 0, i + 1}; // else v = {i, 0}; // int ret = use_machine(v); // ans += (v.size() - 1) - ret; // } // return ans; // } // int main() { // ios::sync_with_stdio(false); // return 0; // }

Compilation message (stderr)

mushrooms.cpp: In function 'int count_mushrooms(int)':
mushrooms.cpp:54:8: warning: unused variable 'doNextSimple' [-Wunused-variable]
   54 |   bool doNextSimple = false;
      |        ^~~~~~~~~~~~
mushrooms.cpp:56:10: warning: unused variable 'COEF' [-Wunused-variable]
   56 |   double COEF = 1.2;
      |          ^~~~
mushrooms.cpp:57:7: warning: unused variable 'iter' [-Wunused-variable]
   57 |   int iter = 1;
      |       ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...