Submission #1350360

#TimeUsernameProblemLanguageResultExecution timeMemory
1350360ozner77LOSTIKS (INOI20_lostiks)C++20
0 / 100
0 ms344 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
vector<ll> K;
map<ll,map<ll,ll>> M;
vector<vector<ll>> UWU;
vector<vector<ll>> adj;
vector<ll> camino;
vector<ll> respuesta;
map<ll,ll> puerta;
vector<bool> visitado;
const int LOG = 20;
vector<vector<ll>> up;
vector<ll> depth;
void dfs_lca(ll v, ll p){
    up[v][0] = p;
    for(int i = 1; i < LOG; i++){
        up[v][i] = up[up[v][i-1]][i-1];
    }
    for(auto to : adj[v]){
        if(to != p){
            depth[to] = depth[v] + 1;
            dfs_lca(to, v);
        }
    }
}
ll lca(ll a, ll b){
    if(depth[a] < depth[b]) swap(a,b);

    ll diff = depth[a] - depth[b];
    for(int i = 0; i < LOG; i++){
        if(diff & (1<<i)){
            a = up[a][i];
        }
    }

    if(a == b) return a;

    for(int i = LOG-1; i >= 0; i--){
        if(up[a][i] != up[b][i]){
            a = up[a][i];
            b = up[b][i];
        }
    }

    return up[a][0];
}
ll dist(ll a, ll b){
    ll c = lca(a,b);
    return depth[a] + depth[b] - 2*depth[c];
}
void meter(ll cur){
    if(visitado[cur]){
        return;
    }
    visitado[cur]=true;
    for(int i=0;i<UWU[cur].size();i++){
        meter(UWU[cur][i]);
    }
    respuesta.push_back(cur);
    if(puerta.count(cur)){
        respuesta.push_back(puerta[cur]);
    }
}
bool dfs2(ll cur,ll p,ll obj){
    if(cur==obj){
        camino.push_back(cur);
        return true;
    }
    for(auto x:adj[cur]){
        if(x!=p){
            if(dfs2(x,cur,obj)){
                camino.push_back(cur);
                return true;
            }
        }
    }
    return false;
}

void dfs(ll cur, ll p,vector<ll> keys){
    if(M[p][cur]!=-1){
        puerta[M[p][cur]]=p;
        keys.push_back(M[p][cur]);
    }
    if(K[cur]==1){
        UWU[cur]=keys;
    }
    for(auto x:adj[cur]){
        if(x!=p){
            dfs(x,cur,keys);
        }
    } 
}
int main(){
    ll n;
    cin>>n;
    ll s,t;
    cin>>s>>t;
    s--;
    t--;
    UWU.resize(n);
    adj.resize(n);
    K.assign(n,0);
    visitado.assign(n,false);
    for(int i=0;i<n-1;i++){
        ll a,b,c;
        cin>>a>>b>>c;
        a--;
        b--;
        c--;
        adj[a].push_back(b);
        adj[b].push_back(a);
        M[a][b]=c;
        M[b][a]=c;
        K[c]=1;     
    }
    for(int i=0;i<n;i++){
        M[i][i]=-1;
    }
    up.assign(n, vector<ll>(LOG));
    depth.assign(n, 0);
    dfs_lca(s, s);
    dfs(s,s,{});
    dfs2(s,-1,t);
    reverse(camino.begin(),camino.end());

    ll actu=s;
    ll ans=0; 

    respuesta.push_back(s);
    for(int i=1;i<camino.size();i++){
        if(M[actu][camino[i]]!=-1){
            meter(M[actu][camino[i]]);
        }
        actu=camino[i];
    }
    respuesta.push_back(t);
    for(int i=1;i<respuesta.size();i++){
        ans += dist(respuesta[i],respuesta[i-1]);
    }
    cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...