Submission #716374

#TimeUsernameProblemLanguageResultExecution timeMemory
716374rainboyMonster Game (JOI21_monster)C++17
100 / 100
91 ms328 KiB
#include "monster.h" using namespace std; typedef vector<int> vi; const int N = 1000; int ii[N], jj[N]; void reverse(int *ii, int n) { int tmp; for (int i = 0, j = n - 1; i < j; i++, j--) tmp = ii[i], ii[i] = ii[j], ii[j] = tmp; } void rotate(int *ii, int n, int d) { d = (d % n + n) % n; for (int i = 0; i < n; i++) jj[(i + d) % n] = ii[i]; for (int i = 0; i < n; i++) ii[i] = jj[i]; } void solve(int *ii, int n, int h_, int i_) { if (h_ == n) return; if (i_ == -1) { if (n - h_ == 1) return; if (n - h_ == 2) { if (h_ > 0) { for (int u = 0; u < 3; u++) if (Query(ii[u], ii[h_])) return; reverse(ii + h_, 2); } } else if (Query(ii[h_], ii[h_ + 2])) { int h = h_ + 3; while (h < n && Query(ii[h_], ii[h])) h++; h--; if (h == h_ + 2) { if (h_ == 0) { solve(ii, n, h + 1, -1); while (!Query(ii[h_], ii[h_ + 3])) rotate(ii + h_, 3, 1); reverse(ii + h_, 3); } else while (1) { for (int u = 0; u < 3; u++) if (Query(ii[u], ii[h_ + 2])) { reverse(ii + h_, 3), solve(ii, n, h + 1, ii[h_ + 2]); return; } rotate(ii + h_, 3, 1); } } else { if (!Query(ii[h_ + 1], ii[h])) rotate(ii + h_, h - h_ + 1, 1); reverse(ii + h_, h - h_ + 1), solve(ii, n, h + 1, ii[h]); } } else { int h = h_ + 3; while (h < n && !Query(ii[h_], ii[h])) h++; rotate(ii + h_, h - h_ + 1, Query(ii[h_ + 1], ii[h]) ? -1 : -2); reverse(ii + h_, h - h_ + 1), solve(ii, n, h + 1, ii[h]); } } else for (int h = h_; h < n; h++) if (Query(i_, ii[h])) { reverse(ii + h_, h - h_ + 1), solve(ii, n, h + 1, ii[h]); return; } } vi Solve(int n) { for (int i = 0; i < n; i++) { int lower = -1, upper = i; while (upper - lower > 1) { int h = (lower + upper) / 2; if (Query(i, ii[h])) lower = h; else upper = h; } for (int h = i; h > upper; h--) ii[h] = ii[h - 1]; ii[upper] = i; } solve(ii, n, 0, -1); vi aa(n, 0); for (int i = 0; i < n; i++) aa[ii[i]] = i; return aa; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...