Submission #1208662

#TimeUsernameProblemLanguageResultExecution timeMemory
1208662k1r1t0게임 (APIO22_game)C++20
12 / 100
7 ms14988 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 310000;

int l[N], r[N], kk;
vector<int> out[N], in[N];

void init(int n, int k) {
	kk = k;
	for (int i = 0; i <= k; i++)
		l[i] = r[i] = i;
	for (int i = k + 1; i <= n; i++)
		l[i] = 0, r[i] = k;
}

bool upd_edge(int u, int v);

bool upd_vert(int v) {
	for (int u : in[v]) if (upd_edge(u, v)) return true;
	for (int u : out[v]) if (upd_edge(v, u)) return true;
	return false;
}

bool upd_edge(int u, int v) {
	if (r[u] < l[v]) return false;
	if (r[v] < l[u]) return true;
	int mu = (l[u] + r[u]) / 2;
	int mv = (l[v] + r[v]) / 2;
	if (r[v] < r[u] && r[v] <= mu) {
		r[u] = mu;
		return upd_vert(u);
	}
	if (l[u] > mv) {
		l[v] = mv + 1;
		return upd_vert(v);
	}
	return false;
}

int add_teleporter(int u, int v) {
	u++; v++;
	if (v <= kk) v--;
	in[v].push_back(u);
	out[u].push_back(v);
	return upd_edge(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...