Submission #1176160

#TimeUsernameProblemLanguageResultExecution timeMemory
1176160gygDungeons Game (IOI21_dungeons)C++20
13 / 100
714 ms592980 KiB
#pragma GCC optimize("O3", "unroll-loops")
#pragma GCC target("avx2")
#include "dungeons.h"
#include <bits/stdc++.h>
using namespace std;
#define sig signed
#define int long long
#define vec vector
#define arr array
const int N = 4e5 + 5, LG = 27;

int n;
arr<int, N> wn, ls, wn_nd, ls_nd;

arr<arr<vec<int>, N>, LG> wn_jmp, ls_jmp;
void jmp_cmp() {
	for (int u = 0; u <= n; u++)
		wn_jmp[0][u] = {wn_nd[u], wn[u], wn[u]};
	for (int i = 1; i <= 25; i++) {
		for (int u = 0; u <= n; u++) {
			vec<int> x = wn_jmp[i - 1][u];
			vec<int> y = wn_jmp[i - 1][x[0]];
			wn_jmp[i][u] = {y[0], x[1] + y[1], max(x[2], y[2] - x[1])};
		}
	}

	for (int u = 0; u <= n; u++)
		ls_jmp[0][u] = {ls_nd[u], ls[u], wn[u] - 1};
	for (int i = 1; i <= 25; i++) {
		for (int u = 0; u <= n; u++) {
			vec<int> x = ls_jmp[i - 1][u];
			vec<int> y = ls_jmp[i - 1][x[0]];
			ls_jmp[i][u] = {y[0], x[1] + y[1], min(x[2], y[2] - x[1])};
		}
	}
	// cout << ls_jmp[1][0][0] << " " << ls_jmp[1][0][1] << " " << ls_jmp[1][0][2] << '\n';
}

void init(sig _n, vec<sig> _wn, vec<sig> _ls, vec<sig> _wn_nd, vec<sig> _ls_nd) {
	n = _n;
	for (int u = 0; u < n; u++)
		wn[u] = _wn[u], ls[u] = _ls[u], wn_nd[u] = _wn_nd[u], ls_nd[u] = _ls_nd[u];
	wn[n] = ls[n] = 0, wn_nd[n] = ls_nd[n] = n;

	jmp_cmp();
}

void mv(int &u, int &s) {
	if (u == n) return;
	if (s >= wn[u]) {
		s += wn[u];
		u = wn_nd[u];
	} else {
		s += ls[u];
		u = ls_nd[u];
	}
}

int simulate(sig _u, sig _s) {
	int u = _u, s = _s;

	for (int i = 25; i >= 0; i--) {
		vec<int> y = ls_jmp[i][u];
		if (y[0] != n && s <= y[2]) {
			u = y[0], s += y[1];
		}
	}
	mv(u, s);

	for (int i = 25; i >= 0; i--) {
		vec<int> x = wn_jmp[i][u];
		if (x[0] != n && s >= x[2]) {
			u = x[0], s += x[1];
		}
	}
	mv(u, s);

	return s;
}

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