Submission #830755

#TimeUsernameProblemLanguageResultExecution timeMemory
830755pavementStations (IOI20_stations)C++17
13 / 100
805 ms808 KiB
#include "stations.h"
#include <bits/stdc++.h>
using namespace std;

#define pb push_back

int idx;
vector<int> dep, in, out;
vector<vector<int> > adj;

void dfs(int u, int e = -1) {
	in[u] = idx++;
	for (auto v : adj[u]) if (v != e) {
		dep[v] = dep[u] + 1;
		dfs(v, u);
	}
	out[u] = idx++;
}

vector<int> label(int n, int k, vector<int> u, vector<int> v) {
	dep = in = out = vector<int>(n, 0);
	adj = vector<vector<int> >(n);
	for (int i = 0; i < (int)u.size(); i++) {
		adj[u[i]].pb(v[i]);
		adj[v[i]].pb(u[i]);
	}
	assert(dep[0] == 0);
	dfs(0);
	assert(dep[0] == 0);
	vector<int> lab(n), vals(n);
	for (int i = 0; i < n; i++) {
		lab[i] = (dep[i] % 2 == 0 ? in[i] : out[i]);
		vals[i] = lab[i];
	}
	sort(vals.begin(), vals.end());
	assert(unique(vals.begin(), vals.end()) == vals.end());
	for (int i = 0; i < n; i++) {
		lab[i] = lower_bound(vals.begin(), vals.end(), lab[i]) - vals.begin();
	}
	for (int i = 0; i < n; i++) {
		adj[i].clear();
	}
	dep.clear();
	in.clear();
	out.clear();
	idx = 0;
	return lab;
}

int find_next_station(int s, int t, vector<int> c) {
	if (binary_search(c.begin(), c.end(), t)) {
		return t;
	}
	if (s == 0) {
		for (int i = 0; i < (int)c.size(); i++) {
			if (t <= c[i]) {
				return c[i];
			}
		}
		assert(0);
	} else if (s < *min_element(c.begin(), c.end())) {
		for (int i = 0; i + 1 < (int)c.size(); i++) {
			if (s < t && t <= c[i]) {
				return c[i];
			}
		}
		return c.back();
	} else {
		assert(*max_element(c.begin(), c.end()) < s);
		for (int i = 1; i < (int)c.size(); i++) {
			if (((i + 1 == (int)c.size() && t < s) || c[i + 1] > t) && t >= c[i]) {
				return c[i];
			}
		}
		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...