제출 #898950

#제출 시각아이디문제언어결과실행 시간메모리
898950Trisanu_DasDungeons Game (IOI21_dungeons)C++17
37 / 100
7066 ms265084 KiB
#include "dungeons.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; //------------------------------------------------ int N; vector<int> s, p, w, l; ll jump[400005][25], jumpSum[400005][25], jumpMX[400005][25]; 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.push_back(0); ::p.push_back(0); ::w.push_back(N); ::l.push_back(N); for(int i = N; i >= 0; i--){ if(i == N){ for(int j = 0; j < 25; j++) jump[i][j] = i, jumpSum[i][j] = 0, jumpMX[i][j] = 0; } else{ jump[i][0] = w[i]; jumpSum[i][0] = s[i]; jumpMX[i][0] = max(s[i], s[w[i]]); for(int j = 1; j < 25; j++){ jump[i][j] = jump[jump[i][j - 1]][j - 1]; jumpSum[i][j] = jumpSum[i][j - 1] + jumpSum[jump[i][j - 1]][j - 1]; jumpMX[i][j] = max(jumpMX[i][j - 1], jumpMX[jump[i][j - 1]][j - 1]); } } } } ll simulate(int st, int x){ int u = st; ll X = x; while(1){ if(u == N) break; if(X >= s[u]){ for(int i = 24; i >= 0; i--) if(jumpMX[u][i]<=X){ X += jumpSum[u][i]; u = jump[u][i]; } X += jumpSum[u][0]; u = jump[u][0]; } else{ X += p[u]; u = l[u]; } } return 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...