Submission #1062871

#TimeUsernameProblemLanguageResultExecution timeMemory
1062871TheQuantiXDungeons Game (IOI21_dungeons)C++17
0 / 100
2 ms2140 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;
vector<ll> wup[10];
vector<ll> wupmx[10];
vector<ll> wupm[10];
vector<ll> lup[24];
vector<ll> lupmn[24];
vector<ll> lupm[24];

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 i = 0; i < 24; i++) {
        lup[i].resize(n + 1);
        lupmn[i].resize(n + 1);
        lupm[i].resize(n + 1);
        if (i == 0) {
            for (int j = 0; j < n; j++) {
                lupm[i][j] = l[j];
                lup[i][j] = p[j];
                lupmn[i][j] = s[j];
            }
            lupm[i][n] = n;
            lupmn[i][n] = 0;
            lup[i][n] = 0;
        }
        else {
            for (int j = 0; j < n + 1; j++) {
                lupm[i][j] = lupm[i - 1][lupm[i - 1][j]];
                lup[i][j] = lup[i - 1][j] + lup[i - 1][lupm[i - 1][j]];
                lupmn[i][j] = min(lupmn[i - 1][j], lupmn[i - 1][lupm[i - 1][j]] - lup[i - 1][j]);
            }
        }
    }
    for (int i = 0; i < 24; i++) {
        wup[i].resize(n + 1);
        wupmx[i].resize(n + 1);
        wupm[i].resize(n + 1);
        if (i == 0) {
            for (int j = 0; j < n; j++) {
                wupm[i][j] = w[j];
                wup[i][j] = s[j];
                wupmx[i][j] = s[j];
            }
            wupm[i][n] = n;
            wupmx[i][n] = 0;
            wup[i][n] = 0;
        }
        else {
            for (int j = 0; j < n + 1; j++) {
                wupm[i][j] = wupm[i - 1][wupm[i - 1][j]];
                wup[i][j] = wup[i - 1][j] + wup[i - 1][wupm[i - 1][j]];
                wupmx[i][j] = max(wupmx[i - 1][j], wupmx[i - 1][wupm[i - 1][j]] - wup[i - 1][j]);
            }
        }
    }
}

long long simulate2(int x, ll z);

long long simulate3(int x, ll z);

long long simulateult(int x, ll z);

long long simulate(int x, int z) {
    return simulateult(x, z);
}

long long simulateult(int x, ll z) {
    // cout << x << endl;
    while (x < n) {
        // cout << x << ' ' << z << '\n';
        if (z >= s[x]) {
            for (int i = 9; i >= 0; i--) {
                // cout << '\t' << i << ' ' << wupmx[i][x] << '\n';
                if (wupmx[i][x] <= z) {
                    z += wup[i][x];
                    x = wupm[i][x];
                }
            }
        }
        else {
            for (int i = 23; i >= 0; i--) {
                // cout << '\t' << i << ' ' << lup[i][x] << ' ' << lupmn[i][x] << '\n';
                if (lupmn[i][x] > z) {
                    z += lup[i][x];
                    x = lupm[i][x];
                }
            }
        }
        if (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;
}
#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...