Submission #623508

#TimeUsernameProblemLanguageResultExecution timeMemory
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...