Submission #1176169

#TimeUsernameProblemLanguageResultExecution timeMemory
1176169gyg던전 (IOI21_dungeons)C++20
13 / 100
1358 ms1861524 KiB
#pragma GCC optimize("O3", "unroll-loops") #pragma GCC target("avx2") #include "dungeons.h" #include <bits/stdc++.h> using namespace std; #define sig signed #define int long long #define vec vector #define arr array const int N = 4e5 + 5, LG = 27, INF = 1e18; int n; arr<int, N> wn, ls, wn_nd, ls_nd; vec<int> unq; int id(int x) { int ans = 0; for (int i = 0; i < unq.size(); i++) if (x >= unq[i]) ans = i; return ans; } int nx(int i) { if (i + 1 == unq.size()) return INF; else return unq[i + 1]; } void unq_cmp() { unq.push_back(0); for (int u = 0; u < n; u++) unq.push_back(wn[u]); unq.erase(unique(unq.begin(), unq.end()), unq.end()); // for (int x : unq) cout << x << " "; // cout << '\n'; } arr<arr<arr<vec<int>, N>, LG>, 7> jmp; void jmp_cmp() { for (int i = 0; i < unq.size(); i++) { for (int u = 0; u <= n; u++) { if (unq[i] >= wn[u]) jmp[i][0][u] = {wn_nd[u], wn[u], nx(i) - 1}; else jmp[i][0][u] = {ls_nd[u], ls[u], nx(i) - 1}; } for (int j = 1; j <= 25; j++) { for (int u = 0; u <= n; u++) { vec<int> x = jmp[i][j - 1][u]; vec<int> y = jmp[i][j - 1][x[0]]; jmp[i][j][u] = {y[0], x[1] + y[1], min(x[2], y[2] - x[1])}; } } } // cout << jmp[0][1][0][0] << " " << jmp[0][1][0][1] << '\n'; } void init(sig _n, vec<sig> _wn, vec<sig> _ls, vec<sig> _wn_nd, vec<sig> _ls_nd) { n = _n; for (int u = 0; u < n; u++) wn[u] = _wn[u], ls[u] = _ls[u], wn_nd[u] = _wn_nd[u], ls_nd[u] = _ls_nd[u]; wn[n] = ls[n] = 0, wn_nd[n] = ls_nd[n] = n; unq_cmp(); jmp_cmp(); } void mv(int &u, int &s) { if (u == n) return; if (s >= wn[u]) { s += wn[u]; u = wn_nd[u]; } else { s += ls[u]; u = ls_nd[u]; } } int simulate(sig _u, sig _s) { int u = _u, s = _s; for (int i = 0; i < unq.size(); i++) { for (int j = 25; j >= 0; j--) { vec<int> x = jmp[i][j][u]; if (s > x[2]) continue; if (x[0] == n) continue; // cout << i << " " << j << " " << u << ": " << x[0] << " " << x[1] << '\n'; u = x[0], s += x[1]; } mv(u, s); // cout << u << " " << s << '\n'; } return s; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...