Submission #1297318

#TimeUsernameProblemLanguageResultExecution timeMemory
1297318jamesbamberTelepathy (JOI25_telepathy)C++20
52 / 100
60 ms896 KiB
#include "telepathy.h"
using namespace std;

#include <iostream>

const int log = 8;

vector<int> bruma(int N, vector<int> A, vector<int> B, int S, int turn) {
    vector<vector<int>> ad(N);
    for(int i=0; i<N-1; i++) {
        ad[A[i]].push_back(B[i]);
        ad[B[i]].push_back(A[i]);
    }

    pair<int, int> centroid = {-1, -1};
    vector<int> sz(N);
    vector<int> up(N);

    auto dfs = [&](auto &&self, int v, int p) -> void {
        up[v] = p;
        sz[v] = 1;

        for(int u: ad[v]) {
            if(u == p) continue;
            self(self, u, v);
            sz[v] += sz[u];
        }
    };

    auto find_centroid = [&](auto &&self, int v, int p) -> void {
        int sz_sum = 1;

        bool is_centroid = 1;

        for(int u: ad[v]) {
            if(u == p) continue;
            self(self, u, v);
            sz_sum += sz[u];

            if(sz[u] > N/2) is_centroid = 0;
        }

        if(N - sz_sum > N/2) is_centroid = 0;

        if(is_centroid) {
            centroid.second = v;
            if(centroid.first == -1) centroid.first = v;
        }
    };

    dfs(dfs, 0, 0);
    find_centroid(find_centroid, 0, 0);

    dfs(dfs, centroid.first, centroid.second);
    dfs(dfs, centroid.second, centroid.first);


    vector<int> ans;

    int curr_node = S;
    ans.push_back(curr_node);

    for(int i=0; i<=log; i++) {
        for(int j=0; j<(1 << i); j++) {
            if(turn) curr_node = up[curr_node];
            ans.push_back(curr_node);

            if(ans.size() == 10*N + 1) return ans;
        }
        turn ^= 1;
    }

    while(ans.size() < 10*N + 1) ans.push_back(ans.back());

    return ans;
}

vector<int> Aitana(int N, vector<int> A, vector<int> B, int S, int subtask) {
    return bruma(N, A, B, S, 0);
}

vector<int> Bruno(int N, vector<int> C, vector<int> D, int T, int subtask) {
    return bruma(N, C, D, T, 1);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...