Submission #985485

#TimeUsernameProblemLanguageResultExecution timeMemory
985485efishelStations (IOI20_stations)C++17
100 / 100
641 ms1796 KiB
#include "stations.h" #include <bits/stdc++.h> using namespace std; using ll = long long; using vll = vector <ll>; using vi = vector <int>; static void dfs (ll u, ll par, ll dep, vi &ans, vector <vll> &adj, ll &timer) { if (!(dep&1)) ans[u] = timer++; for (ll v : adj[u]) { if (v == par) continue; dfs(v, u, dep+1, ans, adj, timer); } if (dep&1) ans[u] += timer++; } vi label (int n, int k, vi vu, vi vv) { vector <vll> adj(n, vll({})); for (ll i = 0; i < n-1; i++) { adj[vu[i]].push_back(vv[i]); adj[vv[i]].push_back(vu[i]); } vi ans(n); ll timer = 0; dfs(0, 0, 0, ans, adj, timer); return ans; } int find_next_station (int s, int t, vi c) { bool isTin = s < c[0]; if (isTin) { // subtree of s has >= s bool isUp = (t < s || (c.size() == 1 ? true : t > c[c.size()-2])) && s != 0; // s==0: s is root if (isUp) { return c[c.size()-1]; // highest tout -> my par } else { return *lower_bound(c.begin(), c.end(), t); // first tout above t } } else { // subtree of s has <= s bool isUp = t > s || (c.size() == 1 ? true : t < c[1]); if (isUp) { return c[0]; // lowest tin -> my par } else { return *(--upper_bound(c.begin(), c.end(), t)); // tout above t, minus 1 pos } } }
#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...