제출 #882295

#제출 시각아이디문제언어결과실행 시간메모리
882295pirhosigCounting Mushrooms (IOI20_mushrooms)C++17
0 / 100
0 ms436 KiB
#include <bits/stdc++.h> #include "mushrooms.h" #define R(a) for (int i = 0; i < a; ++i) #define RR(a) for (int j = 0; j < a; ++j) using namespace std; void query2(vector<int> val[2], bool type, int a, int b) { if (!type) { int qres = use_machine({val[0][0], a, val[0][1], b}); val[(qres / 2) > 0].push_back(a); val[qres % 2].push_back(b); } else { int qres = use_machine({val[1][0], a, val[1][1], b}); val[!(qres / 2)].push_back(a); val[!(qres % 2)].push_back(b); } } int count_mushrooms(int n) { if (n < 200) { int tot = 1; for (int i = 1; i < n; ++i) { tot += 1 - use_machine({0, i}); } return tot; } vector<int> val[2]; val[0].push_back(0); R(2) val[use_machine({0, i + 1})].push_back(i + 1); int up = 3; R(3) { query2(val, val[0].size() > val[1].size(), up, up + 1); up += 2; } int tot = 0; R(30) { if (val[0].size() > val[1].size()) { int n0 = up++; int n1 = up++; int n2 = up++; int n3 = up++; int n4 = up++; int qres = use_machine({val[0][0], n0, val[0][1], n1, val[0][2], n2, val[0][3], n3, val[0][4], n4}); val[qres & 1].push_back(n4); if (qres < 2 || qres > 7) { bool can = qres > 7; val[can].push_back(n0); val[can].push_back(n1); val[can].push_back(n2); val[can].push_back(n3); } else if (qres == 4 || qres == 5) { if (val[1].size() < 2) { query2(val, false, n0, n1); query2(val, false, n2, n3); } else { int cres = use_machine({val[1][0], n0, val[1][1], n1, val[0][0], n2, val[0][1], n3}); val[!(cres & 1)].push_back(n3); val[cres < 4].push_back(n0); if (cres == 1) { val[1].push_back(n1); val[0].push_back(n2); } else if (cres == 2) { val[0].push_back(n1); val[0].push_back(n2); } else if (cres == 3) { val[0].push_back(n1); val[1].push_back(n2); } else if (cres == 4) { val[1].push_back(n1); val[0].push_back(n2); } else if (cres == 5) { val[1].push_back(n1); val[1].push_back(n2); } else if (cres == 6) { val[0].push_back(n1); val[1].push_back(n2); } } } else if (qres == 2 || qres == 3) { if (val[1].size() < 2) { query2(val, false, n0, n1); query2(val, false, n2, n3); } else { int cres = use_machine({val[1][0], n0, val[1][1], n1, n2, n3}); val[cres == 1].push_back(n0); val[cres == 3].push_back(n1); val[cres == 5].push_back(n2); val[cres == 4].push_back(n3); } } else if (qres == 6 || qres == 7) { int cres = use_machine({val[0][0], n0, val[0][1], n1, n2, n3}); val[cres != 1].push_back(n0); val[cres != 3].push_back(n1); val[cres != 5].push_back(n2); val[cres != 4].push_back(n3); } } } while (up < n) { int rem = n - up; int s1 = val[0].size(); int s2 = val[1].size(); if (s1 > s2) { vector<int> query; int qs = min(rem, s1); R(qs * 2) { if (i % 2) query.push_back(up++); else query.push_back(val[0][i / 2]); } int qres = use_machine(query); val[qres % 2].push_back(up - 1); tot += qs - 1 - (qres / 2); } else { vector<int> query; int qs = min(rem, s2); R(qs * 2) { if (i % 2) query.push_back(up++); else query.push_back(val[1][i / 2]); } int qres = use_machine(query); val[!(qres % 2)].push_back(up - 1); tot += qres / 2; } } return tot + val[0].size(); }
#Verdict Execution timeMemoryGrader output
Fetching results...