Submission #592399

#TimeUsernameProblemLanguageResultExecution timeMemory
592399grtDungeons Game (IOI21_dungeons)C++17
63 / 100
2737 ms741292 KiB
//GRT_2018
#include <bits/stdc++.h>
#define PB push_back
#define ST first
#define ND second
//mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());

using namespace std;

using ll = long long;
using pi = pair<int,int>;
using vi = vector<int>;

const int nax = 50 * 1000 + 10, LOG = 25;
const ll INF = 1e18;
int n;
pair<int, ll>jp[nax][LOG][LOG];
ll lim[nax][LOG][LOG];
vi s, p, w, l;


void init(int N, vi _s, vi _p, vi _w, vi _l) {
        n = N;
        s = _s, w = _w, p = _p, l = _l;
        s.PB(n);
        for(int j = 0; j < LOG; ++j) {
            for(int i = 0; i < n; ++i) {
                        int num = (1 << j);
                        if(num >= s[i]) {
                            jp[i][j][0] = {w[i], s[i]};
                                lim[i][j][0] = INF;
                        } else {
                                jp[i][j][0] = {l[i], p[i]};
                                lim[i][j][0] = s[i];
                        }
        }
                jp[n][j][0] = {n, 0};
                lim[n][j][0] = INF;
        }
        for(int k = 1; k < LOG; ++k) {
                for(int j = LOG - 1; j >= 0; --j) {
                        for(int i = 0; i < n; ++i) {
                                auto [id, sum] = jp[i][j][k - 1];
                                lim[i][j][k] = min(lim[i][j][k - 1], lim[id][j][k - 1] - sum);
                                jp[i][j][k] = {jp[id][j][k - 1].ST, sum + jp[id][j][k - 1].ND};
                        }
                        jp[n][j][k] = {n, 0};
                        lim[n][j][k] = INF;
                }
        }
}

ll simulate(int x, int zz) {
        int inf = 10'000'000;
        ll z = zz;
        while(x != n) {
                int bit = LOG - 1;
                if(z < inf) {
                        bit = 31 - __builtin_clz(z);
                }
                for(int i = LOG - 1; i >= 0; --i) {
                        if(z < lim[x][bit][i]) {
                                z += jp[x][bit][i].ND;
                                x = jp[x][bit][i].ST;
                        }
                }
//              cerr << x << " " << z << "\n";
                if(x == n) {
                        return z;
                }
                if(z >= s[x]) {
                        z += s[x];
                        x = w[x];
                } else {
                        z += p[x];
                        x = l[x];
                }
        }
        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...