Submission #894080

#TimeUsernameProblemLanguageResultExecution timeMemory
894080MilosMilutinovicMonster Game (JOI21_monster)C++17
98 / 100
64 ms2284 KiB
#include "monster.h" #include <bits/stdc++.h> using namespace std; namespace { bool example_variable; } // namespace vector<int> Solve(int n) { map<pair<int, int>, bool> mp; function<bool(int, int)> Ask = [&](int x, int y) { if (x > y) { return !Ask(y, x); } if (!mp.count({x, y})) { mp[{x, y}] = Query(x, y); } return mp[{x, y}]; }; vector<int> order(n); iota(order.begin(), order.end(), 0); vector<int> tmp(n); function<void(int, int)> MergeSort = [&](int l, int r) { if (l == r) { return; } int mid = l + r >> 1; MergeSort(l, mid); MergeSort(mid + 1, r); for (int i = l; i <= r; i++) { tmp[i] = order[i]; } int pl = l, pr = mid + 1; int ptr = l; while (pl <= mid || pr <= r) { if (pl > mid) { order[ptr++] = tmp[pr++]; } else if (pr > r) { order[ptr++] = tmp[pl++]; } else { order[ptr++] = (Ask(tmp[pl], tmp[pr]) ? tmp[pl++] : tmp[pr++]); } } }; MergeSort(0, n - 1); int pos = -1; auto Check = [&]() { if (Ask(order[0], order[2])) { return false; } if (!Ask(order[0], order[1])) { return false; } if (!Ask(order[1], order[2])) { return false; } return true; }; if (n <= 10) { vector<int> bad; for (int i = 1; i < n; i++) { if (!Ask(order[0], order[i])) { bad.push_back(i); } } if ((int) bad.size() > 1) { pos = bad.rbegin()[1]; } else { bool ok = true; for (int i = 2; i < n; i++) { if (!Ask(order[1], order[i])) { ok = false; break; } } if (ok) { pos = 1; } else { pos = 0; } } } else { if (Check()) { if (!Ask(order[0], order[3]) && !Ask(order[1], order[3])) { vector<int> bad; for (int i = 1; i < n; i++) { if (!Ask(order[0], order[i])) { bad.push_back(i); } } pos = bad.rbegin()[1]; } else { int smx = -1; vector<int> cnt(3); auto Update = [&](int x) { for (int i = 0; i < 3; i++) { if (cnt[i] > 0) { return; } } for (int i = 0; i < 3; i++) { cnt[i] += !Ask(order[i], x); } }; if (!Ask(order[3], order[5]) && Ask(order[3], order[4]) && Ask(order[4], order[5])) { if (!Ask(order[3], order[6]) && !Ask(order[4], order[6])) { vector<int> bad(order[6]); for (int i = 7; i < n; i++) { int x = 3; for (int j = 3; j <= i - 2; j++) { if (mp.count({j, i})) { x = j; } } if (!Ask(order[x], order[i])) { bad.push_back(order[i]); } } if ((int) bad.size() > 1) { bad.pop_back(); } Update(bad.back()); } else { for (int i = 3; i < 6; i++) { Update(order[i]); } } } else { /* bool ok = true; for (int i = 5; i < n; i++) { if (!Ask(order[4], order[i])) { ok = false; break; } } if (ok) { Update(order[4]); } else { Update(order[3]); } */ Update(order[4]); Update(order[3]); } for (int i = 0; i < 3; i++) { if (cnt[i] > 0) { pos = (i - 1 + 3) % 3; } } } } else { bool ok = true; for (int i = 2; i < n; i++) { if (!Ask(order[1], order[i])) { ok = false; break; } } if (ok) { pos = 1; } else { pos = 0; } } } vector<int> res; function<void(int, int)> Solve = [&](int l, int r) { for (int i = r; i >= l; i--) { res.push_back(order[i]); } if (r == n - 1) { return; } for (int i = r + 1; i < n; i++) { if (!Ask(order[l], order[i])) { Solve(r + 1, i); break; } } }; Solve(0, pos); reverse(res.begin(), res.end()); vector<int> ret(n); for (int i = 0; i < n; i++) { ret[res[i]] = i; } return ret; }

Compilation message (stderr)

monster.cpp: In lambda function:
monster.cpp:30:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   30 |     int mid = l + r >> 1;
      |               ~~^~~
monster.cpp: In function 'std::vector<int> Solve(int)':
monster.cpp:96:13: warning: unused variable 'smx' [-Wunused-variable]
   96 |         int smx = -1;
      |             ^~~
monster.cpp: At global scope:
monster.cpp:8:6: warning: '{anonymous}::example_variable' defined but not used [-Wunused-variable]
    8 | bool example_variable;
      |      ^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...