#include <bits/extc++.h>
#include "mushrooms.h"
using namespace std;
vector<int> a[2] = {{0}, {}};
int idx = 1, k = 100;
// rule: https://oj.uz/submission/303279 model code 참고...
map<vector<int>, string> prec1 = {{{}, "A0B0C0DE"}, {{1}, "CED"}, {{2}, "DBE0A"}, {{3}, "CB0E0DA1"},
{{4}, "D0A0E0CB1"}, {{5}, "DBCE1"}, {{6}, "CED"}};
map<vector<int>, string> prec2 = {{{}, "ABCDE0"}, {{1}, "B0"}, {{1, 1}, "EADC"}, {{2}, "CB0D"},
{{2, 1}, "EADB"}, {{2, 2}, "DAE0CB"}, {{3}, "CB0D"}, {{3, 1}, "EDB0"},
{{3, 2}, "AED"}, {{3, 3}, "ED"}, {{4}, "B0"}, {{4, 1}, "0EACD"}};
int chk(string s, int state) {
string t = s;
int ret = 0;
for (char& c: t) {
if ('A' <= c && c <= 'Z') c = (char) ('0' + ((state) >> (c - 'A') & 1));
}
for (int i = 1; i < t.size(); i++) ret += (t[i - 1] != t[i]);
return ret;
}
int count_mushrooms(int n) {
int ret = 1;
while (idx < n) {
int t = a[0].size() < a[1].size();
if (n - idx < 5 || a[t].size() >= k) {
vector<int> query, &c = a[t];
int qcnt = 0;
for (int i = 0; i < c.size() && idx < n; i++) query.push_back(c[i]), query.push_back(idx++), qcnt++;
int cnt = use_machine(query), p = (cnt + 1) / 2;
if (!t) p = qcnt - p;
ret += p;
if (cnt & 1) a[t ^ 1].push_back(idx - 1);
else a[t].push_back(idx - 1);
}
else {
map<vector<int>, string>& rule = (a[t].size() >= 3 && a[t ^ 1].size() >= 1) ? prec1 : prec2;
vector<int> record, valid(32, 1);
while (rule.count(record)) {
string tmp = rule[record];
vector<int> query, cnt(2, 0);
for (char c: tmp) {
if (c == '0' || c == '1') query.push_back(a[(c - '0') ^ t][cnt[(c - '0') ^ t]++]);
else query.push_back(idx + (c - 'A'));
}
int q = use_machine(query);
record.push_back(q);
for (int state = 0; state < 32; state++) {
if (chk(tmp, state) != q) valid[state] = 0;
}
}
for (int state = 0; state < 32; state++) {
if (valid[state]) {
for (int i = 0; i < 5; i++) {
a[(state >> i & 1) ^ t].push_back(idx + i);
ret += (((state >> i & 1) ^ t) == 0);
}
idx += 5;
break;
}
}
}
}
return ret;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |