Submission #1210343

#TimeUsernameProblemLanguageResultExecution timeMemory
1210343badge881Dungeons Game (IOI21_dungeons)C++20
100 / 100
5929 ms1931292 KiB
#include "dungeons.h"
#include <bits/stdc++.h>
#define sz(a) (int)a.size()

using namespace std;

int N;
vector<int> s, p, w, l;
vector<int> ss;
vector<vector<vector<pair<int, pair<int, int>>>>> nxt;
vector<long long> tw;

const int LOG = 22;
const int MAXS = 1e7;
int sn;

long long pth(int x)
{
    if (x == N)
        return 0;
    if (tw[x] >= 0)
        return tw[x];
    tw[x] = pth(w[x]) + (long long)s[x];
    return tw[x];
}

void init(signed n, std::vector<signed> S, std::vector<signed> P, std::vector<signed> W, std::vector<signed> L)
{
    N = n;
    s.resize(N);
    tw.resize(N, -1);
    p.resize(N);
    w.resize(N + 1);
    l.resize(N + 1);
    l[N] = N;
    w[N] = N;
    for (int i = 0; i < n; i++)
    {
        s[i] = S[i];
        p[i] = P[i];
        w[i] = W[i];
        l[i] = L[i];
    }
    ss.push_back(0);
    int u = 1;
    ss.push_back(u);
    while (u < MAXS)
    {
        u *= 6;
        ss.push_back(u);
    }
    sn = sz(ss);
    nxt.resize(N + 1, vector<vector<pair<int, pair<int, int>>>>(sn, vector<pair<int, pair<int, int>>>(1, {0, {0, 0}})));

    for (int j = 0; j < sz(ss); j++)
    {
        nxt[N][j][0].first = 0;
        nxt[N][j][0].second.first = N;
        nxt[N][j][0].second.second = 1e8;
    }

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < sz(ss); j++)
        {
            if (s[i] <= ss[j])
            {
                nxt[i][j][0].first = s[i];
                nxt[i][j][0].second.first = w[i];
                nxt[i][j][0].second.second = 1e8;
            }
            else
            {
                nxt[i][j][0].first = p[i];
                nxt[i][j][0].second.first = l[i];
                nxt[i][j][0].second.second = s[i];
            }
        }
    }
    for (int j = 1; j < LOG; j++)
    {
        for (int i = 0; i <= N; i++)
        {
            for (int k = 0; k < sz(ss); k++)
            {
                if (j > sz(nxt[i][k]) || nxt[i][k][j - 1].second.first == N || j > sz(nxt[nxt[i][k][j - 1].second.first][k]) || nxt[i][k][j - 1].second.second <= ss[k] || nxt[nxt[i][k][j - 1].second.first][k][j - 1].second.second - nxt[i][k][j - 1].first <= ss[k])
                    continue;
                nxt[i][k].push_back({nxt[i][k][j - 1].first + nxt[nxt[i][k][j - 1].second.first][k][j - 1].first, {nxt[nxt[i][k][j - 1].second.first][k][j - 1].second.first, min(nxt[i][k][j - 1].second.second, nxt[nxt[i][k][j - 1].second.first][k][j - 1].second.second - nxt[i][k][j - 1].first)}});
            }
        }
    }
    return;
}

int cs, u;

long long simulate(signed x, signed z)
{
    cs = z;
    u = x;
    for (int i = 0; i < sz(ss); i++)
    {
        while (ss[i + 1] > cs)
        {
            for (int j = LOG - 1; j >= 0; j--)
            {
                if (j >= sz(nxt[u][i]) || nxt[u][i][j].second.first == N || nxt[u][i][j].second.second <= cs)
                    continue;
                cs += nxt[u][i][j].first;
                u = nxt[u][i][j].second.first;
            }
            if (nxt[u][i][0].second.first == N)
            {
                if (s[u] > cs)
                    cs += p[u];
                else
                    cs += s[u];
                return cs;
            }
            else
            {
                if (s[u] > cs)
                    cs += p[u],
                    u = l[u];
                else
                    cs += s[u],
                        u = w[u];
            }
            if (u == N)
                return cs;
        }
    }
    return (long long)cs + pth(u);
}
#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...