Submission #1296888

#TimeUsernameProblemLanguageResultExecution timeMemory
1296888UnforgettableplMigrations (IOI25_migrations)C++20
79.12 / 100
41 ms1452 KiB
#include "migrations.h"
#include <bits/stdc++.h>
using namespace std;

namespace {
    vector<vector<int>> adj;
    pair<int,int> dfs(int x,int p){
        pair<int,int> ans = {-1,x};
        for(int&i:adj[x])if(i!=p){
            ans = max(ans,dfs(i,x));
        }
        ans.first++;
        return ans;
    }
    int currL,currR,currBest;
}


int send_message(int N, int i, int Pi) {
    if(i==1)adj.resize(N);
    adj[i].emplace_back(Pi);
    adj[Pi].emplace_back(i);
    if(i==9978){
        currL = dfs(0,-1).second;
        currR = dfs(currL,-1).second;
        currBest = dfs(currL,-1).first;
        return 0;
    }
    if(i>9978 and i<9986){ // sending L phase
        if(dfs(currR,-1).first!=currBest){
            // replacing L
            currL = i;
            currBest++;
            return 0;
        }
        if(dfs(currL,-1).first!=currBest){
            currR = i;
            currBest++;
        }
        int bits = (i-9978-1)*2;
        return ((currL>>bits)&3)+1;
    }
    if(i>9985){ // sending R phase
        int offset = 0;
        if(dfs(currR,-1).first!=currBest){
            // replacing L
            currL = i;
            currBest++;
            offset = 2;
        }
        if(dfs(currL,-1).first!=currBest){
            currR = i;
            currBest++;
            return 0;
        }
        int bits = (i-9985-1);
        return (((currR>>bits)&1) + offset)+1;
    }
    return 0;
}

pair<int,int> longest_path(vector<int> S){
    int currL = 0;
    int currR = 0;
    for(int i=9979;i<9986;i++){
        // reading currL
        if(S[i]==0)currL=i;
        else {
            int c = S[i]-1;
            int bits = (i-9978-1)*2;
            currL|=c<<bits;
        }
    }
    for(int i=9986;i<10000;i++){
        // reading currR
        if(S[i]==0)currR=i;
        else {
            int c = S[i]-1;
            if(c&2){
                currL = i;
                c&=1;
            }
            int bits = (i-9985-1);
            currR|=c<<bits;
        }
    }
    return {currL,currR};
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...