Submission #1261312

#TimeUsernameProblemLanguageResultExecution timeMemory
1261312biankDungeons Game (IOI21_dungeons)C++20
100 / 100
2468 ms1526104 KiB
#include "dungeons.h"
#include <bits/stdc++.h>
 
#define forsn(i, s, n) for (int i = int(s); i < int(n); i++)
#define forn(i, n) forsn(i, 0, n)
#define dforsn(i, s, n) for (int i = int(n) - 1; i >= int(s); i--)
#define dforn(i, n) dforsn(i, 0, n)
 
#define sz(x) int(x.size())
#define all(x) begin(x), end(x)
 
#define pb push_back
#define eb emplace_back
 
#define fst first
#define snd second
 
using namespace std;
 
using vi = vector<int>;
using ii = pair<int, int>;
using ll = long long;

const int MAX_N = 4e5 + 9;
const int MAX_K = 8;
const int MAX_B = 24;
const ll INF = 1e18;

ll prize[MAX_K][MAX_B][MAX_N];
ll minPower[MAX_K][MAX_B][MAX_N];
int nxt[MAX_K][MAX_B][MAX_N];
ll dp[MAX_N];

vi s, p, w, l;
int n;

void init(int _n, vi _s, vi _p, vi _w, vi _l) {
    n = _n, s = _s, p = _p, w = _w, l = _l;
    s.pb(0), w.pb(n), p.pb(0), l.pb(n);
    n++;
    dp[n] = 0;
    dforn(i, n) dp[i] = dp[w[i]] + s[i];
    forn(k, MAX_K) {
        forn(i, n) {
            if (s[i] < 1 << (3 * k)) {
                nxt[k][0][i] = w[i];
                prize[k][0][i] = s[i];
                minPower[k][0][i] = INF;
            } else {
                nxt[k][0][i] = l[i];
                prize[k][0][i] = p[i];
                minPower[k][0][i] = s[i];
            }
        }
        forn(b, MAX_B - 1) forn(i, n) {
            int j = nxt[k][b][i];
            nxt[k][b + 1][i] = nxt[k][b][j];
            prize[k][b + 1][i] = prize[k][b][i] + prize[k][b][j];
            minPower[k][b + 1][i] = min(minPower[k][b][i], minPower[k][b][j] - prize[k][b][i]);
        }
    }
}

ll simulate(int x, int z) {
    ll curr = z;
    forn(k, MAX_K) forn(t, 7) {
        dforn(i, MAX_B) {
            if (curr >= (1 << (3 * k)) - 1 && minPower[k][i][x] > curr) {
                curr += prize[k][i][x];
                x = nxt[k][i][x];
            }
        }
        if (s[x] <= curr) {
            curr += s[x], x = w[x];
        } else {
            curr += p[x], x = l[x];
        }
    }
    return curr + dp[x];
}

#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...