Submission #599377

#TimeUsernameProblemLanguageResultExecution timeMemory
599377LucppDungeons Game (IOI21_dungeons)C++17
63 / 100
3610 ms2097152 KiB
#include "dungeons.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const ll INF = 1e18; const int LOG = 24; struct Data{ int pos; ll sum, need; }; Data combine(Data a, Data b){ Data c; c.pos = b.pos; c.sum = a.sum + b.sum; c.need = min(a.need, b.need-a.sum); return c; } int n; vector<int> s, p, w, l; vector<vector<vector<Data>>> jump; 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_; jump.assign(LOG, vector<vector<Data>>(LOG, vector<Data>(n+1))); for(int i = 0; i < LOG; i++){ for(int j = 0; j < n; j++){ if(s[j] <= (1<<i)) jump[i][0][j] = {w[j], s[j], INF}; else jump[i][0][j] = {l[j], p[j], s[j]}; } jump[i][0][n] = {n, 0, 0}; for(int k = 1; k < LOG; k++){ for(int j = 0; j <= n; j++){ jump[i][k][j] = combine(jump[i][k-1][j], jump[i][k-1][jump[i][k-1][j].pos]); } } } } ll simulate(int x, int z) { ll ans = z; while(x != n){ if(ans >= s[x]){ ans += s[x]; x = w[x]; continue; } int layer; for(layer = 0; layer <= LOG && ans >= (1<<layer); layer++); layer--; Data d{x, ans, INF}; for(int k = LOG-1; k >= 0; k--){ Data d2 = combine(d, jump[layer][k][d.pos]); if(d2.need > 0) d = d2; } ans = d.sum; x = d.pos; } return ans; }
#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...