Submission #1046536

#TimeUsernameProblemLanguageResultExecution timeMemory
1046536VMaksimoski008던전 (IOI21_dungeons)C++17
50 / 100
7059 ms268884 KiB
#include "dungeons.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const int maxn = 6e5 + 5;
const int LOG = 25;
vector<int> S, P, W, L;
ll N, sub3 = 1, sub2 = 1, up[maxn][LOG];
ll sum[maxn][LOG], dist[maxn], mx[maxn][LOG];

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=1; i<N; i++) if(S[i] != S[i-1]) sub3 = 0;
    for(int i=0; i<N; i++) if(S[i] != P[i]) sub2 = 0;
    for(int i=N-1; i>=0; i--) dist[i] = dist[W[i]] + S[i];
    if(sub3) {
        for(int i=0; i<N; i++) up[i][0] = L[i], sum[i][0] = P[i];
        up[N][0] = N;

        for(int j=1; j<LOG; j++)
            for(int i=0; i<=N; i++) up[i][j] = up[up[i][j-1]][j-1];
        for(int j=1; j<LOG; j++)
            for(int i=0; i<=N; i++) sum[i][j] = sum[i][j-1] + sum[up[i][j-1]][j-1];
    } else {
        for(int i=0; i<N; i++) up[i][0] = W[i], sum[i][0] = mx[i][0] = S[i];
        up[N][0] = N;

        for(int j=1; j<LOG; j++)
            for(int i=0; i<=N; i++) up[i][j] = up[up[i][j-1]][j-1];
        for(int j=1; j<LOG; j++)
            for(int i=0; i<=N; i++) sum[i][j] = sum[i][j-1] + sum[up[i][j-1]][j-1];
        for(int j=1; j<LOG; j++)
            for(int i=0; i<=N; i++) mx[i][j] = max(mx[i][j-1], mx[up[i][j-1]][j-1] - sum[i][j-1]);
    }
	return;
}

ll simulate(int x, int z) {
    //moze samo min(n, log 10^7) pati da izgubime (so sekoja zaguba, silata barem se duplira)
    //ako si na pozicija da gubis, simulacija
    //ako si na poz da pobedis, bin jumping
    if(sub2) {
        ll ans = z;

        while(true) {
            if(ans < S[x]) {
                ans += P[x];
                x = L[x];
                continue;
            }

            for(int j=LOG-1; j>=0; j--) {
                if(ans >= mx[x][j]) {
                    ans += sum[x][j];
                    x = up[x][j];
                }
            }

            if(x == N) return ans;
        }

        return ans;
    }

    if(sub3) {
        if(z >= S[x]) return (ll)z + dist[x];
        ll ans = z;

        for(int i=LOG-1; i>=0; i--) {
            if(ans + sum[x][i] < S[x]) {
                ans += sum[x][i];
                x = up[x][i];
            }
        }

        if(x == N) return ans;
        if(ans < S[x]) ans += P[x], x = up[x][0];
        return ans + dist[x];
    }

    ll ans = z;
    while(x != N) {
        if(z >= S[x]) {
            z += S[x];
            x = W[x];
        } else {
            z += P[x];
            x = L[x];
        }
    }
	return z;
}

Compilation message (stderr)

dungeons.cpp: In function 'll simulate(int, int)':
dungeons.cpp:87:8: warning: unused variable 'ans' [-Wunused-variable]
   87 |     ll ans = 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...