제출 #837381

#제출 시각아이디문제언어결과실행 시간메모리
837381FulopMate던전 (IOI21_dungeons)C++17
13 / 100
117 ms24888 KiB
#include "dungeons.h" #include <bits/stdc++.h> using namespace std; #define ll long long int n; vector<int> s, p, w, l; long long S; vector<int> windist; vector<array<pair<long long, int>, 25>> par; void calcwindist(int x){ if(x == n)return; if(windist[x])return; calcwindist(w[x]); windist[x] = windist[w[x]]+1; } 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 = s[0]; windist.assign(n+1, 0); for(int i = 0; i < n; i++){ calcwindist(i); } par.resize(n+1); for(int i = 0; i < 25; i++){ par[n][i] = {0, n}; } for(int i = 0; i < n; i++){ par[i][0] = {p[i], l[i]}; } for(int i = 1; i < 25; i++){ for(int j = 0; j < n; j++){ par[j][i] = {par[j][i-1].first + par[par[j][i-1].second][i-1].first, par[par[j][i-1].second][i-1].second}; } } return; } long long simulate(int x, int z) { if(z >= S){ return z + S*windist[x]; } for(int i = 24; i >= 0; i--){ if(x == n){ return z; } if(par[x][i].first + z < S){ z += par[x][i].first; x = par[x][i].second; } } if(x == n){ return z; } z += par[x][0].first; x = par[x][0].second; return z + S * windist[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...