제출 #1337282

#제출 시각아이디문제언어결과실행 시간메모리
1337282edga1공장들 (JOI14_factories)C++20
18 / 100
8089 ms114704 KiB
#include "factories.h"
#include <bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
#define ll long long
using namespace std;

const int N=5e5+5;
const ll INF=1e18;
vector<pair<int,int>> g[N];
int tin[N],tout[N];
ll dist[N];
int pa[N][20];
int tt;

void dfs(int v, int p){
    tin[v]=tt;
    tt++;
    pa[v][0]=p;
    for(int i=1; i<20; i++) pa[v][i]=pa[pa[v][i-1]][i-1];
    for(auto u : g[v]){
        if(u.fi==p) continue;
        dist[u.fi]=dist[v]+u.se;
        dfs(u.fi,v);
    }
    tout[v]=tt;
    tt++;
    return;
}

int isanc(int a, int b){
    return (tin[a]<tin[b]&&tout[a]>tout[b]);
}

int flca(int a, int b){
    if(isanc(a,b)) return a;
    if(isanc(b,a)) return b;
    for(int i=19; i>=0; i--){
        int na=pa[a][i];
        if(!isanc(na,b)) a=na;
    }
    return pa[a][0];
}

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

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