Submission #992183

#TimeUsernameProblemLanguageResultExecution timeMemory
992183pavementDungeons Game (IOI21_dungeons)C++17
63 / 100
1963 ms736968 KiB
#include "dungeons.h" #include <bits/stdc++.h> using namespace std; using ll = long long; #define pb push_back const int MAX_N = 50000, BAND_LIM = 24, DECOMP_LIM = 24; int n, to[BAND_LIM][DECOMP_LIM][MAX_N + 1], wei[BAND_LIM][DECOMP_LIM][MAX_N + 1], lim[BAND_LIM][DECOMP_LIM][MAX_N + 1]; vector<int> s, p, w, l; vector<ll> winner; void init(int n, vector<int> s, vector<int> p, vector<int> w, vector<int> l) { ::n = n; ::s = s; ::p = p; ::w = w; ::l = l; s.pb(0); p.pb(0); w.pb(n); l.pb(n); winner.resize(n + 1); for (int i = n - 1; i >= 0; i--) { winner[i] = winner[w[i]] + s[i]; } for (int b = 0; b < BAND_LIM; b++) { int lb = (1 << b), rb = (1 << (b + 1)) - 1; for (int i = 0; i <= n; i++) { if (s[i] < lb) { // instant-win to[b][0][i] = w[i]; wei[b][0][i] = s[i]; lim[b][0][i] = INT_MAX; } else if (s[i] > rb) { // instant-lose to[b][0][i] = l[i]; wei[b][0][i] = p[i]; lim[b][0][i] = INT_MAX; } else { to[b][0][i] = l[i]; wei[b][0][i] = p[i]; lim[b][0][i] = s[i]; } } for (int k = 1; k < DECOMP_LIM; k++) { for (int i = 0; i <= n; i++) { to[b][k][i] = to[b][k - 1][to[b][k - 1][i]]; if (wei[b][k - 1][i] > rb - wei[b][k - 1][to[b][k - 1][i]]) { wei[b][k][i] = rb; } else { wei[b][k][i] = wei[b][k - 1][i] + wei[b][k - 1][to[b][k - 1][i]]; } if (lim[b][k - 1][to[b][k - 1][i]] - wei[b][k - 1][i] < 0) { lim[b][k][i] = 0; } else { lim[b][k][i] = min(lim[b][k - 1][i], lim[b][k - 1][to[b][k - 1][i]] - wei[b][k - 1][i]); } } } } } ll simulate(int x, int _z) { ll z = _z; for (int b = 0; b < BAND_LIM; b++) { int rb = (1 << (b + 1)) - 1; if (z > rb) { // past this band continue; } for (int k = DECOMP_LIM - 1; k >= 0; k--) { if (lim[b][k][x] <= z || wei[b][k][x] > rb - z) { continue; } z += wei[b][k][x]; x = to[b][k][x]; } if (x == n) { return z; } for (int iter = 0; iter < 2; iter++) { if (z >= s[x]) { z += s[x]; x = w[x]; } else { z += p[x]; x = l[x]; } if (x == n) { return z; } } assert(z > rb); } // win all the way return z + winner[x]; }
#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...