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 "speedrun.h"
// #pragma GCC optimize("Ofast")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,fma")
// #pragma GCC optimize("unroll-loops")
#include "bits/stdc++.h"
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/trie_policy.hpp>
// #include <ext/rope>
using namespace std;
// using namespace __gnu_pbds;
// using namespace __gnu_cxx;
#define li long long
#define ld long double
#define ii pair<int, int>
#define vi vector<int>
#define vvi vector<vi>
#define fi first
#define se second
//#define mp make_pair
#define pb push_back
#define pf push_front
#define eb emplace_back
#define em emplace
#define ob pop_back
#define om pop
#define of pop_front
#define fr front
#define bc back
#define fori(i, a, b) for(int i = (int) (a); i <= (int) (b); ++i)
#define ford(i, a, b) for(int i = (int) (a); i >= (int) (b); --i)
#define all(x) begin(x), end(x)
#define sz(x) ((int)(x).size())
#define bitc __builtin_popcountll
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define rand rng
#define endl '\n'
#define sp ' '
//#define fastio() ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
const int maxn = 2e5 + 5;
int assign_par[maxn], assign_nxt[maxn];
vector<int> g[maxn];
int assign_last;
void dfs(int u, int p) {
assign_nxt[assign_last] = u; assign_last = u;
assign_par[u] = p;
for(int v: g[u]) {
if(v - p) {
dfs(v, u);
}
}
}
void assignHints(int subtask, int N, int A[], int B[]) { /* your solution here */
int n = N;
fori(i,1,n - 1) {
g[A[i]].eb(B[i]);
g[B[i]].eb(A[i]);
}
dfs(1,0);
setHintLen(20);
fori(i,1,n) {
fori(bit, 0, 9) {
setHint(i, bit + 1, assign_par[i] >> bit & 1);
}
fori(bit, 0, 9) {
setHint(i, bit + 11, assign_nxt[i] >> bit & 1);
}
}
}
int speed_par[maxn];
int speed_nxt[maxn];
void prep_info(int now) {
if(!speed_par[now] and !speed_nxt[now]) {
fori(bit, 0, 9) {
int v = getHint(bit + 1);
speed_par[now] ^= (v << bit);
}
fori(bit, 0, 9) {
int v = getHint(bit + 11);
speed_nxt[now] ^= (v << bit);
}
// cout << now << ": " << speed_par[now] << speed_nxt[now] << endl;
}
}
void speedrun(int subtask, int N, int start) { /* your solution here */
int n = N; int now = start;
prep_info(start);
while(now != 1) {
prep_info(now);
goTo(speed_par[now]); now = speed_par[now];
// cout << "now: " << now << endl;
}
fori(i,2,n) {
prep_info(now);
// cout << "now: " << now << sp << speed_par[now] << endl;
int nxt = speed_nxt[now];
// cout << now << " - > " << nxt << endl;
while(1) {
if(goTo(nxt)) {
now = nxt;
break;
}
else {
goTo(speed_par[now]);
now = speed_par[now];
}
}
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |