Submission #1261306

#TimeUsernameProblemLanguageResultExecution timeMemory
1261306biankDungeons Game (IOI21_dungeons)C++20
63 / 100
1602 ms900688 KiB
#include "dungeons.h" #include <bits/stdc++.h> #define forsn(i, s, n) for (int i = int(s); i < int(n); i++) #define forn(i, n) forsn(i, 0, n) #define dforsn(i, s, n) for (int i = int(n) - 1; i >= int(s); i--) #define dforn(i, n) dforsn(i, 0, n) #define sz(x) int(x.size()) #define all(x) begin(x), end(x) #define pb push_back #define eb emplace_back #define fst first #define snd second using namespace std; using vi = vector<int>; using ii = pair<int, int>; using ll = long long; const int MAX_N = 50005; const int MAX_K = 30; const ll INF = 1e18; ll prize[MAX_K][MAX_K][MAX_N]; ll minPower[MAX_K][MAX_K][MAX_N]; int nxt[MAX_K][MAX_K][MAX_N]; vi s, p, w, l; int n; void init(int _n, vi _s, vi _p, vi _w, vi _l) { n = _n, s = _s, p = _p, w = _w, l = _l; s.pb(0), w.pb(n), p.pb(0), l.pb(n); n++; forn(k, MAX_K) { forn(i, n) { if (s[i] < 1 << k) { nxt[k][0][i] = w[i]; prize[k][0][i] = s[i]; minPower[k][0][i] = INF; } else { nxt[k][0][i] = l[i]; prize[k][0][i] = p[i]; minPower[k][0][i] = s[i]; } } forn(b, MAX_K - 1) forn(i, n) { int j = nxt[k][b][i]; nxt[k][b + 1][i] = nxt[k][b][j]; prize[k][b + 1][i] = prize[k][b][i] + prize[k][b][j]; minPower[k][b + 1][i] = min(minPower[k][b][i], minPower[k][b][j] - prize[k][b][i]); } } } ll simulate(int x, int z) { ll curr = z; forn(k, MAX_K) { dforn(i, MAX_K) { if (curr >= (1 << k) - 1 && minPower[k][i][x] > curr) { curr += prize[k][i][x]; x = nxt[k][i][x]; } } if (s[x] <= curr) { curr += s[x], x = w[x]; } else { curr += p[x], x = l[x]; } } return curr; }
#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...