제출 #996747

#제출 시각아이디문제언어결과실행 시간메모리
996747phoenix기지국 (IOI20_stations)C++17
100 / 100
663 ms1044 KiB
#include "stations.h"
#include <vector>
#include <algorithm>
#include <iostream>
#include <numeric>

using namespace std;

const int N = 1010;

int T;
int tin[N];
int tout[N];
vector<int> g[N];

void precalc(int s, int p) {
	tin[s] = T++;
	for (int to : g[s]) if (to != p)
		precalc(to, s);
	tout[s] = T++;
}

vector<int> label(int n, int k, vector<int> u, vector<int> v) {
	T = 0;
	for (int i = 0; i < n; i++) {
		g[i].clear();
	}
	for (int i = 0; i < n - 1; i++) {
		g[u[i]].push_back(v[i]);
		g[v[i]].push_back(u[i]);
	}	
	vector<int> labels(n);
	precalc(0, 0);
	for (int i = 0; i < n; i++)
		if (tin[i] & 1) 
			labels[i] = tout[i];
		else 
			labels[i] = tin[i];
	vector<int> ord(n);
	iota(ord.begin(), ord.end(), 0);
	sort(ord.begin(), ord.end(), [&](int x, int y) {
		return labels[x] < labels[y];
	});	
	for (int i = 0; i < n; i++) 
		labels[ord[i]] = i;
	return labels;
}

int find_next_station(int s, int t, vector<int> c) {
	if ((int)c.size() == 1) 
		return c[0];
	int m = (int)c.size();
	sort(c.begin(), c.end());

	if (!s) {
		int prev = s;
		for (int i = 0; i < m; i++) {
			int l = prev + 1; 
			int r = c[i];
			prev = c[i];
			if (l <= t && t <= r)
				return c[i];
		}
	}

	if (s < c[0]) {
		int prev = s + 1;
		for (int i = 0; i < m - 1; i++) {
			int l = prev; 
			int r = c[i];
			prev = c[i] + 1;
			if (l <= t && t <= r)
				return c[i];
		}
		return c.back(	);
	} 
	int prev = s - 1;
	for (int i = m - 1; i >= 1; i--) {
		int l = c[i];
		int r = prev;
		prev = c[i] - 1;
		if (l <= t && t <= r) 
			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...