Submission #1066261

#TimeUsernameProblemLanguageResultExecution timeMemory
1066261pedroslreyDungeons Game (IOI21_dungeons)C++17
50 / 100
7064 ms330180 KiB
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#include "dungeons.h"

using namespace std;
using lli = long long;

const int MAXN = 4e5 + 10;
const int MAXK = 20;

int pjump[MAXN][MAXK];
lli psum[MAXN][MAXK];
lli pdp[MAXN][MAXK];

int sjump[MAXN][MAXK];
lli ssum[MAXN][MAXK];
lli sdp[MAXN][MAXK];

int N;

void init(int n, vector<int> ss, vector<int> ps, vector<int> ws, vector<int> ls) {
	N = n;
	ss.push_back(0);
	ps.push_back(0);
	ws.push_back(n);
	ls.push_back(n);
	++n;

	for (int i = 0; i < n; ++i) {
		pjump[i][0] = ls[i];
		psum[i][0] = ps[i];
		pdp[i][0] = min(ss[i], ss[ls[i]] - ps[i]);
	}

	for (int k = 1; k < MAXK; ++k) 
		for (int u = 0; u < n; ++u) {
			pjump[u][k] = pjump[pjump[u][k-1]][k-1];
			psum[u][k] = psum[u][k-1] + psum[pjump[u][k-1]][k-1];
			pdp[u][k] = min(pdp[u][k-1], pdp[pjump[u][k-1]][k-1] - psum[u][k-1]);
		}

	for (int i = 0; i < n; ++i) {
		sjump[i][0] = ws[i];
		ssum[i][0] = ss[i];
		sdp[i][0] = max(ss[i], ss[ws[i]] - ss[i]);
	}

	for (int k = 1; k < MAXK; ++k) 
		for (int u = 0; u < n; ++u) {
			sjump[u][k] = sjump[sjump[u][k-1]][k-1];
			ssum[u][k] = ssum[u][k-1] + ssum[sjump[u][k-1]][k-1];
			sdp[u][k] = max(sdp[u][k-1], sdp[sjump[u][k-1]][k-1] - ssum[u][k-1]);
		}
}

lli simulate(int u, int _z) {
	// cerr << "start\n";
	lli z = _z;
	bool win = false;
	while (u != N) {
		// cerr << u << " win = " << win << "\n";
		// cerr << "z = " << z << "\n";
		if (!win) {
			if (ssum[u][0] <= z) {
				win = true;
				continue;
			}
			for (int k = MAXK - 1; k >= 0; --k)
				if (pdp[u][k] > z) {
					z += psum[u][k];
					u = pjump[u][k];
				}
			z += psum[u][0];
			u = pjump[u][0];

			win = true;
		}
		else {
			if (ssum[u][0] > z) {
				win = false;
				continue;
			}
			for (int k = MAXK - 1; k >= 0; --k)
				if (sdp[u][k] <= z) {
					z += ssum[u][k];
					u = sjump[u][k];
				}
			z += ssum[u][0];
			u = sjump[u][0];

			win = false;
		}
	}

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