Submission #1272190

#TimeUsernameProblemLanguageResultExecution timeMemory
1272190StefanSebezFun Tour (APIO20_fun)C++20
0 / 100
2096 ms26756 KiB
#include "fun.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
const int N=1e5+50,lg=18;
vector<int>E[N];
int par[N][lg+1],depth[N];
void DFS(int u,int p=-1){
    par[u][0]=p;
    for(int i=1;i<=lg;i++){if(par[u][i-1]!=-1)par[u][i]=par[par[u][i-1]][i-1];else par[u][i]=-1;}
    for(auto i:E[u]){
        if(i!=p){
            depth[i]=depth[u]+1;
            DFS(i,u);
        }
    }
}
int LCA(int u,int v){
    if(depth[u]<depth[v])swap(u,v);
    for(int i=lg;i>=0;i--) if(par[u][i]!=-1&&depth[par[u][i]]>=depth[v]) u=par[u][i];if(u==v)return u;
    for(int i=lg;i>=0;i--) if(par[u][i]!=par[v][i]) u=par[u][i],v=par[v][i];return par[u][0];
}
int Dist(int u,int v){return depth[u]+depth[v]-2*depth[LCA(u,v)];}
//int dist[1000][1000];
vector<int> createFunTour(int n, int q){
    for(int i=1;i<n;i++){
        E[i].pb(i-1>>1);
        E[i-1>>1].pb(i);
    }
    DFS(0);
    /*for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            dist[i][j]=dist[j][i]=hoursRequired(i,j);
        }
    }*/
    int u=0;
    for(int i=0;i<n;i++) if(Dist(u,0)<Dist(i,0)) u=i;
    bool was[n+10]={false};
    vector<int>res={u};was[u]=true;
    for(int j=1;j<n;j++){
        int maks=0,v;
        for(int i=0;i<n;i++){
            if(was[i]) continue;
            if(maks<=Dist(u,i)) maks=Dist(u,i),v=i;
        }
        res.pb(v);
        was[v]=true;
        u=v;
    }
    return res;
    /*int u=0;
    for(int i=0;i<n;i++) if(dist[u][0]<dist[i][0]) u=i;
    bool was[n+10]={false};
    vector<int>res={u};was[u]=true;
    for(int j=1;j<n;j++){
        int maks=0,v;
        for(int i=0;i<n;i++){
            if(was[i]) continue;
            if(maks<=dist[u][i]) maks=dist[u][i],v=i;
        }
        res.pb(v);
        was[v]=true;
        u=v;
    }
    return res;*/
    /*int H = hoursRequired(0, N - 1);
    int A = attractionsBehind(0, N - 1);
    return std::vector<int>(N);*/
}
#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...