Submission #645300

#TimeUsernameProblemLanguageResultExecution timeMemory
645300Alex_tz307Speedrun (RMI21_speedrun)C++17
100 / 100
135 ms832 KiB
/* Input format: * * N -- number of nodes * a1 b1 -- edge 1 * ... * a(N-1) b(N-1) -- edge N - 1 * x -- start node */ #include <bits/stdc++.h> #include "speedrun.h" using namespace std; /* static map<int, map<int, bool>> mp; static int length = -1; static int queries = 0; static bool length_set = false; static int current_node = 0; static set<int> viz; static map<int, set<int>> neighbours; void setHintLen(int l) { if (length_set) { cerr << "Cannot call setHintLen twice" << endl; exit(0); } length = l; length_set = true; } void setHint(int i, int j, bool b) { if (!length_set) { cerr << "Must call setHintLen before setHint" << endl; exit(0); } mp[i][j] = b; } int getLength() { return length; } bool getHint(int j) { return mp[current_node][j]; } bool goTo(int x) { if (neighbours[current_node].find(x) == end(neighbours[current_node])) { ++queries; return false; } else { viz.insert(current_node = x); return true; } } */ const int kN = 1e3; int par[1 + kN]; vector<int> g[1 + kN]; vector<int> order; void dfs(int u) { order.emplace_back(u); for (int v : g[u]) { if (v != par[u]) { par[v] = u; dfs(v); } } } void assignHints(int subtask, int N, int A[], int B[]) { /* your solution here */ int lg = 0; while (1 << (lg + 1) <= N) { lg += 1; } lg += 1; setHintLen(2 * lg); for (int i = 1; i < N; ++i) { g[A[i]].emplace_back(B[i]); g[B[i]].emplace_back(A[i]); } dfs(1); for (int i = 0; i < N; ++i) { int v = order[i]; for (int bit = 0; bit < lg; ++bit) { if (par[v] & (1 << bit)) { setHint(v, 1 + bit, true); } if (i < N - 1 && (order[i + 1] & (1 << bit))) { setHint(v, lg + 1 + bit, true); } } } } int getPar(int x, int lg) { int res = 0; for (int bit = 0; bit < lg; ++bit) { if (getHint(bit + 1)) { res += (1 << bit); } } return res; } int getNext(int x, int lg) { int res = 0; for (int bit = 0; bit < lg; ++bit) { if (getHint(lg + 1 + bit)) { res += (1 << bit); } } return res; } void speedrun(int subtask, int N, int start) { /* your solution here */ int lg = 0; while (1 << (lg + 1) <= N) { lg += 1; } lg += 1; int l = getLength(); int curr = start; while (curr != 1) { int p = getPar(curr, lg); goTo(p); curr = p; } int nxt = getNext(curr, lg); while (nxt) { if (!goTo(nxt)) { goTo(getPar(curr, lg)); } else { curr = nxt; nxt = getNext(curr, lg); } } } /* int main() { int N; cin >> N; int a[N], b[N]; for (int i = 1; i < N; ++i) { cin >> a[i] >> b[i]; neighbours[a[i]].insert(b[i]); neighbours[b[i]].insert(a[i]); } assignHints(1, N, a, b); if (!length_set) { cerr << "Must call setHintLen at least once" << endl; exit(0); } cin >> current_node; viz.insert(current_node); speedrun(1, N, current_node); if ((int)viz.size() < N) { cerr << "Haven't seen all nodes" << endl; exit(0); } cerr << "OK; " << queries << " incorrect goto's" << endl; return 0; } */

Compilation message (stderr)

speedrun.cpp: In function 'void speedrun(int, int, int)':
speedrun.cpp:122:7: warning: unused variable 'l' [-Wunused-variable]
  122 |   int l = getLength();
      |       ^
#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...