# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
505056 | duchung | Speedrun (RMI21_speedrun) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
#include "speedrun.h"
using namespace std;
const int N = 1005;
int timer = 0;
vector<int> edge[N];
int parent[N] , tin[N] , Euler[N];
void dfs(int u)
{
tin[u] = ++timer;
Euler[timer] = u;
for (int v : edge[u])
{
if (v == parent[u]) continue;
parent[v] = u;
dfs(v);
}
}
void assignHints (int subtask , int n , int eu[] , int ev[])
{
for (int i = 1 ; i < n ; ++i)
{
edge[eu[i]].push_back(ev[i]);
edge[ev[i]].push_back(eu[i]);
}
dfs(1);
setHintLen(20);
for (int u = 1 ; u <= n ; ++u)
{
int v;
if (u != 1)
{
v = parent[u];
for (int j = 0 ; j < 10 ; ++j) setHint(u , j + 1 , v >> j & 1);
}
if (tin[u] == n) v = 1;
else v = Euler[tin[u] + 1];
for (int j = 0 ; j < 10 ; ++j) setHint(u , j + 11 , v >> j & 1);
}
}
pair<int , int> Hint[N];
bool visited[N];
void get_val(int cur)
{
for (int j = 0 ; j < 10 ; ++j) if (getHint(j + 1)) Hint[cur].first ^= 1 << j;
for (int j = 10 ; j < 20 ; ++j) if (getHint(j + 1)) Hint[cur].second ^= 1 << (j - 10);
}
void speedrun(int subtask , int n , int cur)
{
int l = getLength();
int cnt = 1;
while(cnt < n)
{
if (!visited[cur])
{
get_val(cur);
visited[cur] = true;
}
cerr << current_node << " " << cur << " " << Hint[cur].first << " " << Hint[cur].second << "\n";
if (tin[cur] == n)
{
while(cur != 1)
{
if (!visited[cur])
{
get_val(cur);
visited[cur] = true;
}
goTo(Hint[cur].first);
cur = Hint[cur].first;
}
}
else
{
int tmp = Hint[cur].second;
while (!goTo(tmp))
{
goTo(Hint[cur].first);
}
cur = tmp;
}
++cnt;
}
}