Submission #1301007

#TimeUsernameProblemLanguageResultExecution timeMemory
1301007mohammadsamFactories (JOI14_factories)C++20
100 / 100
3150 ms260768 KiB

#include "factories.h"
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using pii = pair<int, int>;

#define pb push_back
#define SZ(x) int(x.size())
#define mins(a, b) (a = min(a,b))

const int MXN = 5e5+5;
const int LOG = 20;

vector<pii> g[MXN];
int h[MXN];
ll H[MXN];
vector<pii> rmq[LOG];
int pos[MXN];

void dfs(int v, int p=0) {
    pos[v] = SZ(rmq[0]);
    rmq[0].pb(pii(h[v], v));
    for(auto pp : g[v]) {
        int u = pp.first, w = pp.second;
        if(u!=p) {
            h[u] = h[v]+1;
            H[u] = H[v]+w;
            dfs(u, v);
            rmq[0].pb(pii(h[v], v));
        }
    }
}
inline int LCA(int u, int v) {
    if((u=pos[u])>(v=pos[v])) swap(u, v);
    int lg = __lg(v-u+1);
    return min(rmq[lg][u], rmq[lg][v-(1<<lg)+1]).second;
}
inline ll dis(int u, int v) {
    return H[u] + H[v] - (H[LCA(u,v)]<<1);
}

int sz[MXN], par[MXN];
bool dead[MXN];
ll dp[MXN];

int get_sz(int v, int p=0) {
    sz[v] = 1;
    for(auto pp : g[v]) {
        int u = pp.first;
        if(!dead[u] && u!=p)
            sz[v] += get_sz(u, v);
    }
    return sz[v];
}
int centorid(int v, int N, int p=0) {
    for(auto pp : g[v]) {
        int u = pp.first;
        if(!dead[u] && u!=p && sz[u]+sz[u]>N)
            return centorid(u, N, v);
    }
    return v;
}
int decompose(int v) {
    dead[v = centorid(v, get_sz(v))] = 1;
    dp[v] = 1e18;
    for(auto pp : g[v]) {
        int u = pp.first;
        if(!dead[u])
            par[decompose(u)] = v;
    }
    return v;
}

void Init(int N, int A[], int B[], int D[]) {
    for(int i=0; i<N-1; i++) {
        g[A[i]+1].pb(pii(B[i]+1, D[i]));
        g[B[i]+1].pb(pii(A[i]+1, D[i]));
    }
    dfs(1);
    for(int i=1; i<LOG; i++) {
        rmq[i] = rmq[i-1];
        for(int j=0; j+(1<<(i-1))<SZ(rmq[i]); j++)
            mins(rmq[i][j], rmq[i-1][j+(1<<(i-1))]);
    }
    decompose(1);
}

long long Query(int S, int X[], int T, int Y[]) {
    for(int i=0, v; i<S; i++) {
        v = X[i]+1;
        while(v) {
            mins(dp[v], dis(v, X[i]+1));
            v = par[v];
        }
    }
    ll ans = 1e18;
    for(int i=0, v; i<T; i++) {
        v = Y[i]+1;
        while(v) {
            mins(ans, dp[v]+dis(v, Y[i]+1));
            v = par[v];
        }
    }
    for(int i=0, v; i<S; i++) {
        v = X[i]+1;
        while(v) {
            dp[v] = 1e18;
            v = par[v];
        }
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...