Submission #833248

#TimeUsernameProblemLanguageResultExecution timeMemory
833248maomao90Monster Game (JOI21_monster)C++17
0 / 100
73 ms464 KiB
// Hallelujah, praise the one who set me free // Hallelujah, death has lost its grip on me // You have broken every chain, There's salvation in your name // Jesus Christ, my living hope #include <bits/stdc++.h> #include "monster.h" using namespace std; #define REP(i, s, e) for (int i = (s); i < (e); i++) #define RREP(i, s, e) for (int i = (s); i >= (e); i--) template <class T> inline bool mnto(T& a, T b) {return a > b ? a = b, 1 : 0;} template <class T> inline bool mxto(T& a, T b) {return a < b ? a = b, 1: 0;} typedef unsigned long long ull; typedef long long ll; typedef long double ld; #define FI first #define SE second typedef pair<int, int> ii; typedef pair<ll, ll> pll; typedef tuple<int, int, int> iii; #define ALL(_a) _a.begin(), _a.end() #define SZ(_a) (int) _a.size() #define pb push_back typedef vector<int> vi; typedef vector<ll> vll; typedef vector<ii> vii; typedef vector<iii> viii; #ifndef DEBUG #define cerr if (0) cerr #endif const int INF = 1000000005; const ll LINF = 1000000000000000005ll; const int MAXN = 1005; namespace { int n; vi p, op; int tmp[MAXN]; bool res[MAXN]; void dnc(int l, int r) { if (l == r) { return; } int m = l + r >> 1; dnc(l, m); dnc(m + 1, r); int pl = l, pr = m + 1; int ptr = l; while (pl <= m || pr <= r) { if (pr > r || (pl <= m && !Query(p[pl], p[pr]))) { tmp[ptr++] = p[pl++]; } else { tmp[ptr++] = p[pr++]; } } REP (i, l, r + 1) { p[i] = tmp[i]; } } } vi Solve(int N) { n = N; p = vi(n); iota(ALL(p), 0); dnc(0, n - 1); vi bad; REP (i, 1, n) { res[i] = Query(p[0], p[i]); if (res[i]) { bad.pb(i); } } bool s0 = res[1]; if (SZ(bad) == 1 && res[1] == 0) { /* int cnt = 0; REP (i, 1, n) { if (i == bad[0]) { continue; } cnt += Query(p[bad[0]], p[i]); } */ if (!Query(p[1], p[bad[0]])) { //if (cnt == 2) { swap(p[0], p[1]); } //assert(cnt <= 2); s0 = 1; } if (!s0) { assert(res[1] == 0); int prv = 1; vi v; REP (i, 2, n) { if (res[i] != res[i - 1]) { v.pb(prv); prv = i; } } v.pb(prv); assert(SZ(v) >= 2); if (SZ(v) >= 4) { reverse(p.begin(), p.begin() + v[2]); } else if ((SZ(v) == 2 ? n : v[2]) - v[1] == 1) { swap(p[0], p[1]); } else { reverse(p.begin(), p.begin() + v[2] - 1); } } REP (i, 0, n - 1) { if (Query(p[i], p[i + 1])) { continue; } int id = -1; REP (j, i + 1, n) { if (Query(p[i], p[j])) { id = j; break; } } assert(id != -1); reverse(p.begin() + i + 1, p.begin() + id + 1); i = id - 1; } vi t(n); REP (i, 0, n) { t[p[i]] = i; } return t; }

Compilation message (stderr)

monster.cpp: In function 'void {anonymous}::dnc(int, int)':
monster.cpp:51:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   51 |         int m = l + r >> 1;
      |                 ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...