Submission #1046636

#TimeUsernameProblemLanguageResultExecution timeMemory
1046636mariaclaraStations (IOI20_stations)C++17
100 / 100
543 ms1452 KiB
#include "stations.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef tuple<int,int,int> trio;
#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()
#define pb push_back
#define mk make_pair
#define fr first 
#define sc second

int t;
vector<tuple<int,int,int>> val;
vector<int> labels;
vector<vector<int>> edges;

void dfs(int x, int pai, int niv) {
	t++;
	if(niv%2 == 0) labels[x] = t;

	for(int viz : edges[x]) if(viz != pai) dfs(viz, x, niv+1);

	if(niv%2 == 1) labels[x] = t;
	val.pb({labels[x], niv, x});
}

vector<int> label(int n, int k, vector<int> u, vector<int> v) {
	labels.clear();
	edges.clear();
	val.clear();
	labels.resize(n);
	edges.resize(n);
	t = -1;
	
	for(int i = 0; i < n-1; i++) edges[u[i]].pb(v[i]), edges[v[i]].pb(u[i]);

	dfs(0, -1, 0);
	sort(all(val), [](trio a, trio b){
		if(get<0>(a) != get<0>(b)) return get<0>(a) < get<0>(b);
		return get<1>(a) > get<1>(b);
	});

	for(int i = 0; i < n; i++) {
		int ind = get<2>(val[i]);
		labels[ind] = i;
	}

	return labels;
}

int find_next_station(int s, int t, vector<int> c) {
	// primeiro descobrir se S guarda t_in ou t_out
	// se S guarda t_out, então t_in[viz] < t_out[s]
	// caso contrario, t_out[viz] > t_in[s]

	if(sz(c) == 1) return c[0];

	if(c.back() < s) {
		// S guarda t_out
		int t_in = c[1] - 1, t_out = s;
		if(t < t_in or t_out < t) return c[0];
		// caso contrário t está na sub de s
		// sub[viz] = {t_in[viz], t_in[viz+1]-1}
		// basta achar o primeiro cara tal que x < c[viz], a resposta é o cara anterior
		auto ptr = upper_bound(all(c), t);
		ptr--;
		return *ptr;
	}
	else {
		// S guarda t_in
		int t_in = s, t_out = c[sz(c) - 2];
		if(t < t_in or t_out < t) return c.back();
		// caso contrário t está na sub de s
		// sub[viz] = {t_out[viz-1]+1, t_out[viz]}
		auto ptr = lower_bound(all(c), t);
		return *ptr;
	}
}
#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...