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...