Submission #1197571

#TimeUsernameProblemLanguageResultExecution timeMemory
1197571KK_1729Speedrun (RMI21_speedrun)C++20
100 / 100
57 ms488 KiB
#include "speedrun.h"
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define FOR(i,a,b) for (int i = (a); i < (b); ++i)
void assignHints(int subtask, int N, int A[], int B[]) { /* your solution here */
		vector<vector<int>> adj(N+1);
		FOR(i,1,N){
			adj[A[i]].pb(B[i]);
			adj[B[i]].pb(A[i]);
		}

		vector<int> arr;
		vector<int> visited(N+1);
		stack<int> s;
		s.push(1);
		vector<int> par(N+1);
		while (!s.empty()){
			int current = s.top();
			s.pop();

			if (visited[current]) continue;
			arr.pb(current);
			for (auto x: adj[current]){
				s.push(x);
				if (!visited[x]) par[x] = current;
			}
			visited[current] = 1;
		}
		setHintLen(20);
		// arr.pb(0);
		FOR(i,0,N){
			// int k = 0;
			int d = arr[(i+1)%N];
			FOR(j,0,10){
				if (par[arr[i]] & (1 << j)){
					// k |= (1 << j);
					setHint(arr[i], j+1, 1);
				}else{
					setHint(arr[i], j+1, 0);
				}
				if (d & (1 << j)){
					// k |= (1 << (j+10));
					setHint(arr[i], j+11, 1);
					
				}else{
					setHint(arr[i], j+11, 0);
				}
			}

			
		}
		// for (int x: arr) cout << x << " ";
		// cout << endl;
		return;

}

void speedrun(int subtask, int N, int start) { /* your solution here */
	vector<int> visited(N+1);
	int c = 0;
	int u = 0;
	while (start != 1){
		// u++;
		// if (u > 5) break;
		int par = 0;
		
		FOR(i,1,11){
			if (getHint(i)) par |= (1 << (i-1));
		}
		goTo(par);
		// cout << start << par << endl;
		start = par;
	}
	int current = start;
	int curtogo = 0;
	int o = 0;

	while (c < N){
		o++;
		// if (o > 40) break;
		int ne = 0;
		int par = 0;
		
		FOR(i,1,11){
			if (getHint(i)) par |= (1 << (i-1));
		}
		FOR(i,11,21){
			if (getHint(i)) ne |= (1 << (i-1-10));
		}
		if (!visited[current]){
			c++;
			visited[current] = 1;
		}
		// cout << current << curtogo << endl;
		if (curtogo){
			// visited[current] = 1;
			bool can = goTo(curtogo);
			if (can){
				current = curtogo;
				curtogo = 0;
			}else{
				goTo(par);
				current = par;
			}
		}else{
			if (!visited[ne]){
				bool can = goTo(ne);
				if (can){
					current = ne;
					curtogo = 0;
				}else{
					goTo(par);
					curtogo = ne;
				}
			}else{
				goTo(par);
				current = par;
				curtogo = 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...