Submission #623701

#TimeUsernameProblemLanguageResultExecution timeMemory
623701MohamedFaresNebili던전 (IOI21_dungeons)C++17
50 / 100
7033 ms466660 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; ll N, D[400005], A[400005][30], B[400005][30], R[400005][30], M[400005][30]; vector<ll> S, P, W, L; vector<ll> rev[400005]; bool sameS = 1; long long solve(int i, int k) { if(i == N) return k; if(S[i] > k) return solve(L[i], k + P[i]); k += D[i]; for(int l = 25; l >= 0; l--) { if(M[i][l] <= k) i = R[i][l]; } i = R[i][0]; if(i == N) return k; k -= D[i]; return solve(L[i], k + P[i]); } void dfs(int v, int p) { for(auto u : rev[v]) { D[u] = D[v] + S[u]; R[u][0] = v; M[u][0] = S[v] + D[v]; dfs(u, v); } } void init(int n, vector<int> s, vector<int> p, vector<int> w, vector<int> l) { N = n; S.resize(n), P.resize(n), W.resize(n), L.resize(n); for(int i = 0; i < N; i++) { S[i] = s[i], P[i] = p[i], W[i] = w[i], L[i] = l[i]; A[i][0] = L[i], B[i][0] = P[i]; sameS &= (S[i] == S[0]); rev[W[i]].push_back(i); } A[N][0] = N; R[N][0] = N; L[N] = N; dfs(N, N); for(int i = 1; i < 30; i++) for(int l = 0; l <= N; l++) { A[l][i] = A[A[l][i - 1]][i - 1]; R[l][i] = R[R[l][i - 1]][i - 1]; B[l][i] = B[l][i - 1] + B[A[l][i - 1]][i - 1]; M[l][i] = max(M[l][i - 1], M[R[l][i - 1]][i - 1]); } } long long simulate(int x, int z) { if(!sameS) return solve(x, z); ll res = z; for(int l = 25; l >= 0; l--) if(res + B[x][l] < S[0]) { res += B[x][l]; x = A[x][l]; } if(res >= S[0]) return res + D[x]; res += P[x]; x = L[x]; res += D[x]; return res; }
#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...