#include "dungeons.h"
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define fi first
#define se second
const int LOG=30;
vector<int> s, p, w, l, dist;
vector<vector<pair<int, int>>> up;
int n;
void init(signed _n, vector<signed> _s, vector<signed> _p, vector<signed> _w, vector<signed> _l) {
n=_n;
for (auto &u: _s) s.pb(u);
for (auto &u: _p) p.pb(u);
for (auto &u: _w) w.pb(u);
for (auto &u: _l) l.pb(u);
dist.resize(n+1); dist[n]=0;
for (int i=n-1; i>=0; i--) dist[i]=dist[w[i]]+1;
up.resize(n+1, vector<pair<int, int>>(LOG, {n, 0}));
for (int i=0; i<n; i++) up[i][0]={l[i], p[i]};
for (int bit=1; bit<LOG; bit++) {
for (int i=0; i<n; i++) {
up[i][bit]=up[up[i][bit-1].fi][bit-1];
up[i][bit].se+=up[i][bit-1].se;
}
}
return;
}
int simulate(signed x, signed z) {
int ans=z;
for (int bit=LOG-1; bit>=0; bit--) {
if (up[x][bit].fi!=n && up[x][bit].se+ans<s[0]) ans+=up[x][bit].se, x=up[x][bit].fi;
}
if (ans<s[0]) ans+=p[x], x=up[x][0].fi;
return ans+dist[x]*s[0];
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |