Submission #1019888

#TimeUsernameProblemLanguageResultExecution timeMemory
1019888groshiSpeedrun (RMI21_speedrun)C++17
100 / 100
141 ms1364 KiB
#include "speedrun.h" #include<bits/stdc++.h> using namespace std; const int maxn = 1005; const int L = 20; const int D = 1024; int mask[maxn]; vector<int> edge[maxn]; void assignHints(int subtask, int N, int A[], int B[]) { /* your solution here */ for(int i=1;i<N;i++){ edge[A[i]].push_back(B[i]); edge[B[i]].push_back(A[i]); } function<void(int,int)> dfs = [&](int u,int p){ int cc=0; for(int v:edge[u]){ if(v==p) continue; dfs(v,u); if(cc) mask[cc]+=v*D; else mask[u]+=v; cc=v; } if(cc) mask[cc]+=p*D; }; dfs(1,0); setHintLen(L); for(int i=1;i<=N;i++){ for(int j=0;j<L;j++) setHint(i,j+1,mask[i]>>j&1); } } bool vis[maxn]; void speedrun(int subtask, int N, int start) { /* your solution here */ int cnt=0; for(int i=1;i<=N;i++) mask[i]=0; function<void(int)> dfs = [&](int u){ //cout << u << '\n'; if(vis[u]) return; vis[u]=true;cnt++; for(int j=0;j<L;j++) mask[u]|=(getHint(j+1)<<j); int v=mask[u]%D; if(!v && u==start){ for(int i=1;i<=N;i++) if(goTo(i)){ dfs(i);goTo(u); break; } } while(v && cnt<N){ if(!goTo(v)) break; dfs(v);goTo(u); v=mask[v]/D; } }; dfs(start); }
#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...