Submission #1019310

#TimeUsernameProblemLanguageResultExecution timeMemory
1019310j_vdd16Counting Mushrooms (IOI20_mushrooms)C++17
84.01 / 100
5 ms604 KiB
#include "mushrooms.h" #include <algorithm> #include <bitset> #include <cstdint> #include <cstring> #include <iostream> #include <limits.h> #include <math.h> #include <map> #include <numeric> #include <queue> #include <set> #include <stack> #include <string> #include <vector> //#define int long long #define loop(X, N) for(int X = 0; X < (N); X++) #define all(V) V.begin(), V.end() #define rall(V) V.rbegin(), V.rend() using namespace std; typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int, int> ii; typedef vector<ii> vii; typedef vector<vector<ii>> vvii; typedef vector<bool> vb; typedef vector<vector<bool>> vvb; //int use_machine(vi x); int count_mushrooms(int n) { if (n < 10) { int As = 1; for (int i = 1; i < n; i++) { if (!use_machine({ 0, i })) As++; } return As; } vi a = { 0 }; vi b; int i = 1; if (use_machine({ 0, 1 }) == 1) { b.push_back(1); if (use_machine({ 0, 2 })) b.push_back(2); else a.push_back(2); i += 2; } else { a.push_back(1); i++; } int result = a.size(); while (i < n) { if (a.size() > b.size()) { int sq = a.size(); vi ask; int asked; if (i <= 164 && i + 1 < n) { asked = 2; } else if (i <= 300 && i + 2 < n && a.size() >= 3) { asked = 3; } else { asked = min(sq, n - i); } loop(j, asked) { ask.push_back(a[j]); ask.push_back(i++); } int res = use_machine(ask); result += asked - res / 2 - res % 2; if (res % 2) b.push_back(i - 1); else a.push_back(i - 1); int others = (res - res % 2) / 2; if (others == asked - 1) { loop(j, asked - 1) b.push_back(i - 2 - j); } else if (others == 0) { loop(j, asked - 1) a.push_back(i - 2 - j); } } else { int sq = b.size(); vi ask; int asked; if (i <= 164 && i + 1 < n) { asked = 2; } else if (i <= 300 && i + 2 < n && b.size() >= 3) { asked = 3; } else { asked = min(sq, n - i); } loop(j, asked) { ask.push_back(b[j]); ask.push_back(i++); } int res = use_machine(ask); result += res / 2 + res % 2; if (res % 2) a.push_back(i - 1); else b.push_back(i - 1); int others = (res - res % 2) / 2; if (others == asked - 1) { loop(j, asked - 1) a.push_back(i - 2 - j); } else if (others == 0) { loop(j, asked - 1) b.push_back(i - 2 - j); } } } return result; }
#Verdict Execution timeMemoryGrader output
Fetching results...