Submission #1062555

#TimeUsernameProblemLanguageResultExecution timeMemory
1062555TheQuantiXDungeons Game (IOI21_dungeons)C++17
11 / 100
7096 ms19780 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

ll n, m, q, k, x, y, a, b, c;
vector<int> s, p, w, l;
bool testcase3;
vector<ll> up[30];
vector<ll> upm[30];
vector<ll> wins;

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;
    set<ll> st;
    for (int i = 0; i < n; i++) {
        st.insert(s[i]);
    }
    if (st.size() == 1) {
        testcase3 = 1;
        for (int i = 0; i < 30; i++) {
            up[i].resize(n + 1);
            upm[i].resize(n + 1);
            if (i == 0) {
                for (int j = 0; j < n; j++) {
                    upm[i][j] = l[j];
                    up[i][j] = p[j];
                }
                upm[i][n] = n;
                up[i][n] = 0;
            }
            else {
                for (int j = 0; j < n + 1; j++) {
                    upm[i][j] = upm[i - 1][upm[i - 1][j]];
                    up[i][j] = up[i - 1][j] + up[i - 1][upm[i - 1][j]];
                }
            }
        }
        // cout << "DEBUG" << endl;
        wins.resize(n + 1);
        for (int i = n - 1; i >= 0; i--) {
            // cout << i << ' ' << s[i] << endl;
            wins[i] = s[i] + wins[w[i]];
        }
    }
}

long long simulate3(int x, ll z);

long long simulate(int x, int z) {
    if (testcase3) {
        return simulate3(x, z);
    }
    while (x < n) {
        if (z >= s[x]) {
            z += s[x];
            x = w[x];
        }
        else {
            z += p[x];
            x = l[x];
        }
        // cout << x << ' ' << z << '\n';
    }
    return z;
}

long long simulate3(int x, ll z) {
    for (int i = 29; i >= 0; i--) {
        // cout << i << ' ' << up[i][x] << '\n';
        if (z + up[i][x] < s[0] && upm[i][x] != n) {
            // cout << z + up[i][x] << '\n';
            z += up[i][x];
            x = upm[i][x];
            // cout << x << ' ' << z << '\n';
        }
    }
    z += p[x];
    x = l[x];
    // cout << x << ' ' << z << '\n';
    z += wins[x];
    // cout << n << ' ' << z << '\n';
    return z;
}
#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...