Submission #1355482

#TimeUsernameProblemLanguageResultExecution timeMemory
135548224ta_tdanh공장들 (JOI14_factories)C++20
0 / 100
5 ms836 KiB
#include <bits/stdc++.h>
#define endl '\n'
#define fi first
#define se second
#define eb emplace_back
#define pb push_back
#define ALL(A) A.begin(), A.end()
#define FOR(i, l, r) for (int i = l; i <= r; i++)
#define FOR2(i, l, r) for (int i = l; i >= r; i--)
using namespace std;
using ll = long long;
using pii = pair<int, int>;
 
const int N = 3e5 + 10;
const ll INF = 1e18; 


// Author : T_Danh - Tri An High School 
 
 
struct Anc {
    int ancestor;
    ll dist;
};
 
int n;
ll dist[N + 1];
ll dist_to_anc[N + 1][2];
vector<pii> adj[N + 1]; 
vector<Anc> ancestors[N + 1]; 
vector<int> vis_anc;
int sz[N + 1];
bool removed[N + 1];
 
void dfs_sz(int u, int p) {
    sz[u] = 1;
    for (auto& to : adj[u]) {
        if (to.fi != p && !removed[to.fi]) {
            dfs_sz(to.fi, u);
            sz[u] += sz[to.fi];
        }
    }
}
 
int find_centroid(int u, int p, int total) {
    for (auto& to : adj[u]) {
        if (to.fi != p && !removed[to.fi] && sz[to.fi] > total / 2)
            return find_centroid(to.fi, u, total);
    }
    return u;
}
 
void reset_dist(int u, int p, int centroid) {
    ancestors[u].eb(centroid , dist[u]);
    dist[u] = INF;
    for(auto& to : adj[u]){
        if(!removed[to.fi] && to.fi != p){
            reset_dist(to.fi , u , centroid);
        }
    }

}
 
void build(int cur) {
    dfs_sz(cur, -1);
    int centroid = find_centroid(cur, -1, sz[cur]);
    removed[centroid] = true;
    priority_queue<pair<ll,int> , vector<pair<ll,int>> ,  greater<pair<ll,int>>> q;
    q.push({0, centroid});
    dist[centroid] = 0;
    while(!q.empty()){
        ll d = q.top().fi ;int u = q.top().se; q.pop();
        if(dist[u] != d) continue;
        for(auto& to : adj[u]) if(!removed[to.fi]){
            ll nd = d + to.se;
            int v = to.fi;
            if(nd < dist[v]){
                q.push({dist[v] = nd, v});
            }
        }
    }
    reset_dist(centroid , centroid , centroid);
    for (auto& to : adj[centroid]) {
        if (!removed[to.fi]) build(to.fi);
    }
}
void add(int u , int type){
    for(Anc& anc : ancestors[u]){
        dist_to_anc[anc.ancestor][type] = min(dist_to_anc[anc.ancestor][type] , anc.dist);
        vis_anc.eb(anc.ancestor);
    }
}
void Init(int N , int A[] , int B[] , int D[]){
    n = N;
    FOR(i,0,n-2){
        adj[A[i]].eb(B[i] , D[i]);
        adj[B[i]].eb(A[i] , D[i]);
    }
    build(1);
}
ll Query(int S , int X[] , int T , int Y[]) {
    ll ans = INF;
    FOR(i,0,S-2){
        add(X[i] , 0);
    }
    FOR(i,0,T - 2){
        add(Y[i] , 1);
    }
    for(int i : vis_anc){
        ans = min(ans , dist_to_anc[i][0] + dist_to_anc[i][1]);
        dist_to_anc[i][0] = dist_to_anc[i][1] = INF;
    }
    vis_anc.clear();
    return ans;
}

// int main() {
//     ios::sync_with_stdio(0); 
//     cin.tie(0);
    
//     #define NAME "newbarn"
//     if (fopen(NAME ".in", "r")) {
//         freopen(NAME ".in", "r", stdin);
//         freopen(NAME ".out", "w", stdout);
//     }
 
//     return 0;
// }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...