Submission #1234229

#TimeUsernameProblemLanguageResultExecution timeMemory
1234229madamadam3Stations (IOI20_stations)C++20
36.32 / 100
315 ms624 KiB
#include "stations.h"
#include <bits/stdc++.h>

using namespace std;

#ifdef LOCAL
	#define dbg(x) (cout << (x))
#else
	#define dbg(x)
#endif

typedef long long ll;
using vi =vector<int>;
using vvi = vector<vi>;
using vl = vector<ll>;
#define pb push_back
#define FOR(i, a, b) for (int i = a; i < b; i++)
#define trace(x) for (auto &el : x) {dbg(el); dbg(" ");}

int n, k;
vi U, V, labels;
vvi adj;
int cur_label = 0;
int timer = 0;
vi tin, tout;

void dfs(int u, int p) {
	tin[u] = timer++;

	for (auto &v : adj[u]) {
		if (v == p) continue;
		dfs(v, u);
	}

	tout[u] = timer;
	labels[u] = tin[u] * 1001 + tout[u];
}

vi label(int N, int K, vi x, vi y) {
	n = N; k = K;
	U = x; V = y;
	cur_label = 0;
	tin.assign(n, 0); tout.assign(n, 0);
	timer = 0;

	adj.assign(n, vi());
	vi deg(n); for (int i = 0; i < n - 1; i++) {
		deg[U[i]]++, deg[V[i]]++;
		adj[U[i]].push_back(V[i]);
		adj[V[i]].pb(U[i]);
	}

	labels.assign(n, 0);
	dfs(0, 0);
	trace(labels); dbg("\n");
	return labels;
}

inline bool is_ancestor(int s, int t) {
	int stin = s / 1001, stout = s % 1001;
	int ttin = t / 1001, ttout = t % 1001;

	// dbg("s = "); dbg(s); dbg(" t = "); dbg(t); dbg("\n");
	// dbg("tin[s] = "); dbg(stin); dbg(" tout[s] = "); dbg(stout); dbg("\n");
	// dbg("tin[t] = "); dbg(ttin); dbg(" tout[t] = "); dbg(ttout); dbg("\n");

	return stin <= ttin && stout >= ttout;
}

inline bool is_root(int s) {
	return (s / 1001) == 0;
}

inline int get_parent(int s, vi &c) {
	for (auto el : c) {
		if (is_ancestor(el, s)) {
			return el;
		}
	}

	return s;
}

int find_next_station(int s, int t, vi c) {
	// dbg("s: "); dbg(s); dbg(" t: "); dbg(t); dbg(" c: "); trace(c); dbg("\n");
	if (!is_root(s) && !is_ancestor(s, t)) {
		int parent = get_parent(s, c);
		// dbg("parent is: "); dbg(parent); dbg("\n");
		return parent;
	}

	for (auto &el : c) {
		if (!is_root(s) && el == get_parent(s, c)) continue;
		if (!is_ancestor(el, t)) continue;

		return el;
	}
	return c[0];
}
#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...