제출 #1337071

#제출 시각아이디문제언어결과실행 시간메모리
1337071Valters07공장들 (JOI14_factories)C++20
#2-10 실행 중
8092 ms114716 KiB
#include "factories.h"
#include <bits/stdc++.h>
#define pb push_back
#define ll long long
#define fi first
#define se second
using namespace std;

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

vector<pair<int,int> > g[N];
ll dist[N];
int par[N][LOG];
int tin[N], tout[N], tt;

void dfs(int u, int p)
{
    tin[u] = ++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, d] : g[u])
    {
        if(v != p)
        {
            dist[v] = dist[u] + d;
            dfs(v, u);
        }
    }
    tout[u] = tt;
}

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

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

int get_lca(int u, int 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];
}

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