Submission #1234607

#TimeUsernameProblemLanguageResultExecution timeMemory
1234607guanex기지국 (IOI20_stations)C++20
0 / 100
304 ms592 KiB
#include "stations.h"
#include<bits/stdc++.h>
using namespace std;

typedef vector<int> vi;
typedef vector<vi> vvi;
#define pb push_back

vi tin(1005), tout(1005), depth(1005);
#define sz(u) (int(u.size()))
int cnt = 0;

void dfs(int no, int fat, int dept, vvi &ed){
	tin[no] = cnt;
	cnt++;
	for(auto e:ed[no]){
		if(e == fat)continue;
		dfs(e, no, dept+1, ed);
	}
	cnt++;
	tout[no] = cnt;
}

std::vector<int> label(int n, int k, std::vector<int> u, std::vector<int> v) {
	cnt = 0;
	tin.assign(1005, 0);
	tout.assign(1005, 0);
	depth.assign(1005, 0);
	vvi ed(n+1);
	for(int i = 0; i < sz(u); ++i){
		ed[u[i]].pb(v[i]);
		ed[v[i]].pb(u[i]);
	}
	dfs(0, -1, 0, ed);
	vector<pair<int, int>> labels;
	for(int i = 0; i < n; ++i){
		if(depth[i] % 2 == 0){
			labels.pb({tin[i], i});
		}else{
			labels.pb({tout[i], i});
		}
	}
	//sort(labels.begin(), labels.end());
	vi ans(n);
	for(int i = 0; i < n; ++i){
		ans[labels[i].second] = labels[i].first;
	}
	return ans;
}

int find_next_station(int s, int t, std::vector<int> c) {
	sort(c.begin(), c.end());
	if(s < c[0]){ // even depth -> tin
		if(t < s || t >= c[sz(c)-1]){
			return c[sz(c)-1];
		}
		int past = s;
		for(auto e:c){
			int ti = past+1;
			int tou  = e;
			if(t >= ti && t <= tou){
				return e;
			}
			past = tou;
		}
		return c[sz(c)-1];

	}else{ // odd depth -> tout
		if(t > s || t <= c[0]){
			return c[0];
		}
		int past = s;
		reverse(c.begin(), c.end());
		for(auto e:c){
			int ti = e;
			int tou = past-1;
			if(t >= ti && t <= tou){
				return e;
			}
			past = ti;
		}
		return c[sz(c)-1];
	}
}
#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...