제출 #623701

#제출 시각아이디문제언어결과실행 시간메모리
623701MohamedFaresNebiliDungeons Game (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...