Submission #559040

#TimeUsernameProblemLanguageResultExecution timeMemory
559040Mamedov기지국 (IOI20_stations)C++17
0 / 100
3051 ms2097152 KiB
#include "stations.h" #include <bits/stdc++.h> #define pii pair<int, int> #define f first #define s second using namespace std; /* Label v with tin[v] for even levels and tout[v] for odd levels. This gives us labels of even numbers between [0, 2*n-2]. We can divide each label by 2, so we get all labels in [0, n-1] Note: We can always restore [tin[v], tout[v]] by v and its neighbors' labels. */ vector<vector<int>>g; vector<int>tin, tout; vector<int>labels; int timer = 0; void dfs(int v, int par, int level) { tin[v] = timer++; for (int to : g[v]) { if (to != par) { dfs(to, v, level + 1); } } tout[v] = timer++; if (level % 2 == 0) { labels[v] = tin[v]; } else { labels[v] = tout[v]; } } int compress(int n, vector<int> &v) { vector<pii>p(n); for (int i = 0; i < n; ++i) { p[i].f = v[i]; p[i].s = i; } sort(p.begin(), p.end()); int new_val = 0; for (int i = 0; i < n - 1; ++i) { v[p[i].s] = new_val; if (p[i + 1].f != p[i].f) { ++new_val; } } v[p[n - 1].s] = new_val; return new_val; } vector<int> label(int n, int k, vector<int> u, vector<int> v) { g.resize(n); tin.resize(n); tout.resize(n); labels.resize(n); for (int i = 0; i < n - 1; ++i) { g[u[i]].emplace_back(v[i]); g[v[i]].emplace_back(u[i]); } dfs(0, 0, 0); compress(n, labels); return labels; } int find_next_station(int s, int t, vector<int> c) { if (c[0] > s) { /// s is labeled with tin[] if (t < s) { return c.back(); } else { auto itr = lower_bound(c.begin(), c.end(), t); if (itr == c.end()) --itr; return (*itr); } } else { /// s is labeled with tout[] if (t > s) { return c[0]; } else { auto itr = upper_bound(c.begin(), c.end(), t); if (itr != c.begin()) --itr; return (*itr); } } }
#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...