Submission #1345094

#TimeUsernameProblemLanguageResultExecution timeMemory
1345094nagorn_phStations (IOI20_stations)C++20
100 / 100
289 ms620 KiB
#include "stations.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

#define ordered_set <int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>
#define ordered_multiset <int, null_type, less_equal <int>, rb_tree_tag, tree_order_statistics_node_update>

#define double long double
#define pii pair <int, int>
#define tiii tuple <int, int, int>
#define tiiii tuple <int, int, int, int>
#define emb emplace_back
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define iShowSpeed cin.tie(NULL)->sync_with_stdio(false)
#define matrix vector <vector <int>>
#define mat(n, m) vector <vector <int>> (n, vector <int> (m));

const int mod = 1e9 + 7;
const matrix II = {{1, 0}, {0, 1}};
const int N = 1e3 + 5;
const int LG = 10;

int n;
vector <int> adj[N];
int par[N][LG];
vector <int> labell(N), revlabel(N), depth(N);
int idx = 0;

void dfs(int u, int p){
	par[u][0] = p;
	depth[u] = depth[p] + 1;
	if (depth[u] % 2) labell[u] = idx++;
	for (auto v : adj[u]) {
		if (v == p) continue;
		dfs(v, u);
	}
	if (depth[u] % 2 == 0) labell[u] = idx++;
}

std::vector<int> label(int nn, int k, std::vector<int> u, std::vector<int> v) {
	n = nn;
	idx = 0;
	for (int i = 0; i < n; i++) adj[i].clear();
	for (int i = 0; i < n - 1; i++) {
		adj[u[i]].emb(v[i]);
		adj[v[i]].emb(u[i]);
	}
	memset(par, -1, sizeof par);
	labell.resize(n);
	dfs(0, 0);
	for (int i = 0; i < n; i++) revlabel[labell[i]] = i;
	return labell;
}

int find_next_station(int s, int t, std::vector<int> c) {
	sort(all(c)); int sz = c.size();
	if (s < c[0]) { // in
		if (t >= s && t <= c[0]) return c[0];
		for (int i = 0; i + 1 < sz - 1; i++) {
			if (t >= c[i] + 1 && t <= c[i + 1]) return c[i + 1];
		}
		return c.back();
	}
	else { // out
		if (t >= c.back() && t <= s) return c.back();
		for (int i = 1; i + 1 < sz; i++) {
			if (t >= c[i] && t <= c[i + 1] - 1) 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...