Submission #996747

#TimeUsernameProblemLanguageResultExecution timeMemory
996747phoenixStations (IOI20_stations)C++17
100 / 100
663 ms1044 KiB
#include "stations.h" #include <vector> #include <algorithm> #include <iostream> #include <numeric> using namespace std; const int N = 1010; int T; int tin[N]; int tout[N]; vector<int> g[N]; void precalc(int s, int p) { tin[s] = T++; for (int to : g[s]) if (to != p) precalc(to, s); tout[s] = T++; } vector<int> label(int n, int k, vector<int> u, vector<int> v) { T = 0; for (int i = 0; i < n; i++) { g[i].clear(); } for (int i = 0; i < n - 1; i++) { g[u[i]].push_back(v[i]); g[v[i]].push_back(u[i]); } vector<int> labels(n); precalc(0, 0); for (int i = 0; i < n; i++) if (tin[i] & 1) labels[i] = tout[i]; else labels[i] = tin[i]; vector<int> ord(n); iota(ord.begin(), ord.end(), 0); sort(ord.begin(), ord.end(), [&](int x, int y) { return labels[x] < labels[y]; }); for (int i = 0; i < n; i++) labels[ord[i]] = i; return labels; } int find_next_station(int s, int t, vector<int> c) { if ((int)c.size() == 1) return c[0]; int m = (int)c.size(); sort(c.begin(), c.end()); if (!s) { int prev = s; for (int i = 0; i < m; i++) { int l = prev + 1; int r = c[i]; prev = c[i]; if (l <= t && t <= r) return c[i]; } } if (s < c[0]) { int prev = s + 1; for (int i = 0; i < m - 1; i++) { int l = prev; int r = c[i]; prev = c[i] + 1; if (l <= t && t <= r) return c[i]; } return c.back( ); } int prev = s - 1; for (int i = m - 1; i >= 1; i--) { int l = c[i]; int r = prev; prev = c[i] - 1; if (l <= t && t <= r) 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...