Submission #1275298

#TimeUsernameProblemLanguageResultExecution timeMemory
1275298StefanSebezTelepathy (JOI25_telepathy)C++20
51 / 100
56 ms904 KiB
#include "telepathy.h"
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
#define mp make_pair
const int N=210,lg=8;
vector<int>E[N];
int par[N],sajz[N];
void DFS(int u,int p=-1){
    par[u]=p;sajz[u]=1;
    for(auto i:E[u]) if(i!=p) DFS(i,u),sajz[u]+=sajz[i];
}
vector<int> Solve(int n,vector<int>A,vector<int>B,int S,int bit){
    for(int i=0;i<=n;i++) E[i].clear();
    for(int i=0;i<n-1;i++){
        E[A[i]].pb(B[i]);
        E[B[i]].pb(A[i]);
    }
    DFS(0);
    vector<int>cent;
    for(int i=0;i<n;i++){
        bool moze=true;
        for(auto j:E[i]){
            if(j==par[i]) continue;
            if(2*sajz[j]>n) moze=false;
        }
        if(2*(n-sajz[i])>n) moze=false;
        if(moze) cent.pb(i);
    }
    DFS(cent[0]);
    vector<int>res={S},vtx;
    for(int u=S;u!=-1;u=par[u]) vtx.pb(u);
    if(cent.size()>=2&&(vtx.size()<=1||vtx[vtx.size()-2]!=cent[1])) vtx.pb(cent[1]);
    int m=vtx.size();
    for(int j=0,e=1,i=0;j<lg;j++,e<<=1){
        if(j%2==bit){
            for(int ct=0;ct<e;ct++){
                i++;if(i>=m) i=m-1;
                res.pb(vtx[i]);
            }
            for(int ct=0;ct<e;ct++) res.pb(vtx[i]);
        }
        else{
            for(int ct=0;ct<e;ct++) res.pb(vtx[i]);
            for(int ct=0;ct<e;ct++){
                i++;if(i>=m) i=m-1;
                res.pb(vtx[i]);
            }
        }
    }
    //for(auto i:res) printf("%i ",i);printf("\n");
    while(res.size()<10*n+1) res.pb(res.back());
    while(res.size()>10*n+1) res.pop_back();
    //for(auto i:res) printf("%i ",i);printf("\n");
    return res;
}
std::vector<int> Aitana(int n, std::vector<int> A, std::vector<int> B, int S, int subtask) {
    return Solve(n,A,B,S,0);
}

std::vector<int> Bruno(int n, std::vector<int> A, std::vector<int> B, int S, int subtask) {
    return Solve(n,A,B,S,1);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...