| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 505056 | duchung | Speedrun (RMI21_speedrun) | C++17 | 0 ms | 0 KiB | 
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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;
	}
}
