제출 #1189445

#제출 시각아이디문제언어결과실행 시간메모리
1189445hamzabc기지국 (IOI20_stations)C++20
100 / 100
301 ms588 KiB
#include "stations.h"
#include <bits/stdc++.h>


using namespace std;


vector<vector<int>> graph;
vector<int> sbsize;
vector<int> labels;


void dfs1(int a, int p){
	for (auto go : graph[a]){
		if (go == p)
			continue;
		dfs1(go, a);
		sbsize[a] += sbsize[go];
	}
}

void dfs(int a, int p){
	int j = labels[a];
	for (auto go : graph[a]){
		if (go == p)
			continue;
		if (labels[p] >= labels[a]){
			j += sbsize[go];
			labels[go] = j;
		}else{
			j -= sbsize[go];
			labels[go] = j;
		}
		dfs(go, a);
	}
}


std::vector<int> label(int n, int k, std::vector<int> u, std::vector<int> v) {
	labels.clear();
	sbsize.clear();
	graph.clear();
	labels.resize(n);
	sbsize.resize(n, 1);
	graph.resize(n);
	for (int i = 0; i < n - 1; i++){
		graph[u[i]].push_back(v[i]);
		graph[v[i]].push_back(u[i]);
	}
	dfs1(0, 0);
	dfs(0, 0);
	return labels;
}

int find_next_station(int s, int t, std::vector<int> c) {
	if (s < c[0]){
		if (t < s || t >= c[c.size() - 1]){
			return c[c.size() - 1];
		}
		int tmp = c[c.size() - 1];
		for (auto k : c){
			if (t <= k){
				tmp = min(tmp, k);
			}
		}
		return tmp;
	}else{
		if (t > s || t <= c[0]){
			return c[0];
		}
		int tmp = c[0];
		for (auto k : c){
			if (t >= k){
				tmp = max(tmp, k);
			}
		}
		return tmp;
	}
	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...