Submission #1337384

#TimeUsernameProblemLanguageResultExecution timeMemory
1337384kitijakFactories (JOI14_factories)C++20
18 / 100
8089 ms161544 KiB
#include "factories.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <climits>
#include <stdio.h>
#include <math.h>
#define ll long long
#define pii pair<long long, long long>
#define pb push_back
#define fi first
#define se second
using namespace std;

const int N = 5e5 +5;
const ll INF = 1e18 +5;
const int LOG=log2(N) +2;

vector<pii>graph[N];
ll tin[N], tout[N], tt, par[N][LOG], dist[N];


void dfs(ll u, ll p){
    tin[u]=tt;
    tt++;
    par[u][0]=p;
    for(int i=1; i<LOG; i++)
        par[u][i]=par[par[u][i-1]][i-1];
    for(auto v : graph[u]){
        if(v.fi!=p){
            dist[v.fi]=dist[u]+v.se;
            dfs(v.fi, u);
        }
    }
    tout[u]=tt;
}

bool isanc(ll u, ll v){
    return (tin[u]<=tin[v] && tout[u]>=tout[v]);
}

ll lca(ll u, ll v){
    if(isanc(u, v))
        return u;
    if(isanc(v, u))
        return v;
    for(int i=LOG-1; i>=0; i--)
        if(!isanc(par[u][i], v))
            u=par[u][i];
    return par[u][0];
}

void Init(int N, int A[], int B[], int D[]){
    for(int i=0; i<N; i++){
        graph[A[i]].pb({B[i], D[i]});
        graph[B[i]].pb({A[i], D[i]});
    }
    dfs(0, 0);
}

long long Query(int S, int X[], int T, int Y[]){
    ll mn=INF;
    for(int i=0; i<S; i++){
        for(int j=0; j<T; j++){
            int x=lca(X[i], Y[j]);
            mn=min(mn, dist[X[i]]-dist[x]+dist[Y[j]]-dist[x]);
        }
    }
  return mn;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...