Submission #726517

#TimeUsernameProblemLanguageResultExecution timeMemory
726517hollwo_pelwGame (APIO22_game)C++17
100 / 100
1298 ms57476 KiB
#include "game.h"

#ifdef hollwo_pelw_local
#include "grader.cpp"
#endif

#include <bits/stdc++.h>
using namespace std;

const int N = 3e5 + 5;

int n, k, tl[N], tr[N], res = 0;
vector<int> gi[N], go[N];

void init(int _n, int _k) {
	n = _n, k = _k;
	for (int i = 0; i < k; i++)
		tl[i] = tr[i] = i;
	for (int i = k; i < n; i++)
		tl[i] = tr[i] = i;
	for (int i = k; i < n; i++)
		tl[i] = -1, tr[i] = k;
}

inline int mid(int u) {
	return tl[u] + (tr[u] - tl[u]) / 2; // (tl[u] + tr[u]) / 2;
}

inline void debug(int u) {
	cout << "[" << tl[u] << ", " << mid(u) << "] -> " << u << " -> [" << mid(u) << ", " << tr[u] << "]" << endl;
}

inline int update(int u, int v) {
	if (tr[u] <= tl[v]) return 0;
	if (tl[u] >= tr[v]) return 1;

	// debug(u);
	// debug(v);

	while (mid(v) < tl[u]) {
		// cout << "UPDaTE " << v  << endl;
		// debug(v);
		tl[v] = mid(v) + 1;
		for (int x : go[v])
			if (update(v, x)) return 1;
	}

	while (mid(u) >= tr[v]) {
		// cout << "UpdAte " << u << endl;
		// debug(u);
		tr[u] = mid(u);
		for (int x : gi[u])
			if (update(x, u)) return 1;
	}

	return 0;
}

int add_teleporter(int u, int v) {
	if (v <= u && u < k)
		return 1;
	if (u == v) return 0;

	// cout << "ADD " << u << " -> " << v << endl;

	go[u].push_back(v);
	gi[v].push_back(u);

	return update(u, v);
}
#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...