This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
int N, D[50005], A[50005][30][2];
vector<int> S, P, W, L;
vector<int> rev[50005];
bool sameS = 1;
long long solve(int i, int k) {
if(i == N) return k;
if(k >= S[i]) return solve(W[i], k + S[i]);
return solve(L[i], k + P[i]);
}
void dfs(int v, int p) {
for(auto u : rev[v]) {
D[u] = D[v] + S[0];
dfs(u, v);
}
}
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;
for(int l = 0; l < N; l++) {
A[l][0][0] = L[l], A[l][0][1] = P[l];
sameS &= (S[l] == S[0]);
rev[W[l]].push_back(l);
}
for(int i = 1; i < 30; i++)
for(int l = 0; l <= N; l++) {
A[l][i][0] = A[A[l][i - 1][0]][i - 1][0];
A[l][i][1] = A[l][i - 1][1] + A[A[l][i - 1][0]][i - 1][1];
}
dfs(N, N);
}
using ll = long long;
long long simulate(int x, int z) {
if(!sameS) return solve(x, z);
ll M = S[0] - z;
if(M <= 0) return D[x];
ll lo = 0, hi = 1e7, C = 0;
while(lo <= hi) {
ll md = (lo + hi) / 2;
ll p = 0, v = x;
for(ll l = 0; l < 30; l++)
if(md & (1 << l)) p += A[v][l][1], v = A[v][l][0];
if(p >= M) C = p + ll(D[v]), hi = md - 1;
else lo = md + 1;
}
return z + C;
}
# | 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... |