제출 #1337381

#제출 시각아이디문제언어결과실행 시간메모리
1337381diana공장들 (JOI14_factories)C++20
0 / 100
105 ms828 KiB
#include "factories.h"
#include <bits/stdc++.h>
#define fi first
#define se second
#define ll long long
#define pii pair<ll, ll>
using namespace std;

const ll M = 5e5+3, R=1e16, L=25;
int n;
vector<pii> graf[M];
int tin[M], tout[M], tt=0;
int par[M][L];
ll dist[M];

void dfs(int v, int p)
{
    par[v][0] = p;
    for(int i=1; i<L; i++)
        par[v][i] = par[par[v][i-1]][i-1];
    tin[v] = ++tt;
    for(auto [u,d] : graf[v])
        if(p != u)
            dist[u] = dist[v]+d,
            dfs(u,v);
    tout[v] = ++tt;
}

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

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

void Init(int N, int A[], int B[], int D[]) {
    n = N;
    for(int i=0; i<N; i++)
        graf[A[i]].push_back({B[i], D[i]}),
        graf[B[i]].push_back({A[i], D[i]});
    dfs(0,0);
    for(int i=0; i<n; i++)
        cout << i << ": " << dist[i] << '\n';
}

long long Query(int S, int X[], int T, int Y[]) {
    ll ans = R;
    for(int i=0; i<S; i++)
        for(int j=0; j<T; j++)
        {
            int u = X[i], v = Y[j];
            int a = lca(u, v);
            ans = min(ans, dist[u]+dist[v]-dist[a]*2);
        }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...