제출 #623508

#제출 시각아이디문제언어결과실행 시간메모리
623508MohamedFaresNebiliDungeons Game (IOI21_dungeons)C++17
11 / 100
161 ms68676 KiB
#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 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...