제출 #1349050

#제출 시각아이디문제언어결과실행 시간메모리
1349050tsengang공장들 (JOI14_factories)C++20
100 / 100
1772 ms247740 KiB
#include <bits/stdc++.h>
#define ll long long
#define ff first
#define ss second
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define ertunt return
#define rall(x) x.rbegin(),x.rend()
using namespace std;
ll n;
vector<pair<ll,ll>> adj[500005];
vector<ll> sz(500005), dead(500005), parC(500005,-1), best(500005,1e15);
ll anc[500005][20], dista[500005][20], anc_size[500005];
ll dfs_size(ll x,ll p){
    sz[x] = 1;
    for(auto [y,w] : adj[x]){
        if(y != p && !dead[y]){
            sz[x] += dfs_size(y,x);
        }
    }
    return sz[x];
}
ll dfs_centroid(ll x,ll p,ll compsize){
    for(auto [y,w] : adj[x]){
        if(y != p && !dead[y] && sz[y] > compsize/2) return dfs_centroid(y,x,compsize);
    }
    return x;
}
void dfs_dist(ll u,ll p,ll c,ll d){
    anc[u][anc_size[u]] = c;
    dista[u][anc_size[u]] = d;
    anc_size[u]++;
    for(auto [v,w] : adj[u]){
        if(v!=p && !dead[v]) dfs_dist(v,u,c,d+w);
    }
}
void build(ll x,ll p){
    ll compsize = dfs_size(x,-1);
    ll c = dfs_centroid(x,-1,compsize);
    parC[c] = p;
    dead[c] = 1;
    dfs_dist(c,-1,c,0);
    for(auto [y,w] : adj[c]){
        if(!dead[y]) build(y,c);
    }
}
void Init(int N,int A[],int B[],int D[]){
    n = N;
    for(int i=0;i<n;i++){
        adj[i].clear();
        dead[i] = 0;
        parC[i] = -1;
        best[i] = 1e15;
        sz[i] = 0;
        anc_size[i] = 0;
        for(int j=0;j<20;j++) dista[i][j] = 0;
    }
    for(int i=0;i<n-1;i++){
        adj[A[i]].pb({B[i],D[i]});
        adj[B[i]].pb({A[i],D[i]});
    }
    build(0,-1);
}
ll Query(int S,int A[],int T,int B[]){
    vector<int> v;
    for(int i=0;i<S;i++){
        int u = A[i];
        for(int j=0;j<anc_size[u];j++){
            int c = anc[u][j];
            ll d = dista[u][j];
            if(best[c]==1e15) v.push_back(c);
            best[c] = min(best[c],d);
        }
    }
    ll ans = 1e18;
    for(int i=0;i<T;i++){
        int u = B[i];
        for(int j=0;j<anc_size[u];j++){
            int c = anc[u][j];
            ll d = dista[u][j];
            ans = min(ans,best[c]+d);
        }
    }
    for(auto x : v) best[x] = 1e15;
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...