Submission #1292821

#TimeUsernameProblemLanguageResultExecution timeMemory
1292821kahoulStations (IOI20_stations)C++20
36.23 / 100
408 ms568 KiB
#include "stations.h"
#include <bits/stdc++.h>
using namespace std;

const int maxn = 5003;
vector<int> rel[maxn];
int in[maxn];
int out[maxn];

int t = 0;

void dfs (int u, int p) {
	in[u] = t++;
	for (auto v : rel[u]) {
		if ( v== p) continue;
		dfs(v,u );
	}
	out[u] = t;
}

vector<int> label(int n, int k, vector<int> u, vector<int> v) {
	for (int i = 0; i < n; i++) {
		rel[i].clear();
		in[i] = 0;
		out[i] = 0;
	}
	t = 0;

	vector<int> labels(n, 0);
	for (int i = 0; i < n -1; i++) {
		rel[u[i]].push_back(v[i]);
		rel[v[i]].push_back(u[i]);
	}
	dfs(0, 0);

	for (int i = 0; i < n; i++) {
		labels[i] = (in[i] << 10) + out[i];
		if (labels[i] > k) return labels;
	}

	return labels;
}

typedef pair<int, int> pii;

pii find (int x) {
	pii ans = {x >> 10, x - ((x >> 10) << 10)};
	//cout << x << ' ' << ans.first << ' ' << ans.second << '\n';
	return ans;
}

int find_next_station(int u, int t, vector<int> adj) {
	if (adj.size() == 1) return adj[0];

	auto [in, out] = find(u);
	auto [tin, tout] = find(t);

	int parent = 0;
	for (auto v : adj) {
		auto [vin, vout] = find(v);
		if (vin <= in && out <= vout) parent = v;
		else if (vin <= tin && tout <= vout) return v;
	}

	return parent;
}
#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...