제출 #1341542

#제출 시각아이디문제언어결과실행 시간메모리
1341542nieh공장들 (JOI14_factories)C++17
0 / 100
2183 ms262800 KiB
#include <bits/stdc++.h>
#include "factories.h"

#define LINF 0x3f3f3f3f3f3f3f3f
#define fi first
#define se second
#define el cout << '\n';
#define maxn int(5e5 + 5)

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, int> pli;

int sz[maxn];

ll mn[maxn];

bool isc[maxn];

vector<pli> deps;

vector<pii> adj[maxn];

vector<pli> acs[maxn];

void dfscount(int u, int p = -1) {
    sz[u] = 1;
    for(pii x : adj[u]) {
        int v = x.fi;
        if(v != p && !isc[v]) {
            dfscount(v, u);
            sz[u] += sz[v];
        }
    }
}

int centroid(int u, int n, int p = -1) {
    for(pii x : adj[u]) {
        int v = x.fi;
        if(v != p && !isc[v] && sz[v] > (n >> 1)) return centroid(v, n, u);
    }
    return u;
}

void dfs(int u, int p, ll d) {
    deps.push_back({ d, u });
    for(pii x : adj[u]) {
        int v = x.fi, w = x.se;
        if(v != p && !isc[v]) dfs(v, u, d + w);
    }
}

void cd(int u, int p = -1) {
    dfscount(u);
    int c = centroid(u, sz[u]);
    isc[c] = 1;

    for(pii x : adj[c]) {
        int v = x.fi, w = x.se;
        if(!isc[v]) {
            deps.clear();
            dfs(v, c, w);
            for(pli x : deps)
                acs[x.se].push_back({ x.fi, c });
        }
    }
    acs[c].push_back({ 0, c });

    for(pii x : adj[c]) {
        int v = x.fi;
        if(!isc[v]) cd(v, c);
    }
}


void Init(int N, int A[], int B[], int D[]) {
    for(int i = 0; i < N - 1; i++) {
        adj[A[i]].push_back({ B[i], D[i] });
        adj[B[i]].push_back({ A[i], D[i] });
    }

    cd(0);
    memset(mn, 0x3f, sizeof mn);
}

void paint(int u) {
    for(pli x : acs[u]) {
        ll d = x.fi;
        int v = x.se;
        mn[v] = min(mn[v], d);
    }
}

void reset(int u) {
    for(pli x : acs[u]) {
        ll d = x.fi;
        int v = x.se;
        mn[v] = LINF;
    }
}

ll get(int u) {
    ll res = LINF;
    for(pii x : acs[u]) {
        ll d = x.fi;
        int v = x.se;
        res = min(res, mn[v] + d);
    }
    return res;
}

ll Query(int S, int X[], int T, int Y[]) {
    ll res = LINF;
    for(int i = 0; i < S; i++) paint(X[i]);
    for(int i = 0; i < T; i++) res = min(res, get(Y[i]));
    for(int i = 0; i < S; i++) reset(X[i]);
    return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...