제출 #682747

#제출 시각아이디문제언어결과실행 시간메모리
682747NK_공장들 (JOI14_factories)C++17
0 / 100
21 ms12372 KiB
// Success consists of going from failure to failure without loss of enthusiasm #include <bits/stdc++.h> #include "factories.h" using namespace std; #define nl '\n' using ll = long long; using E = array<int, 2>; const int nax = 5e5+5; vector<E> adj[nax]; bool vis[nax]; int par[nax], siz[nax]; ll dx[nax], dy[nax], W[nax]; const ll INFL = ll(1e18) + 10; int find_size(int u, int p = -1) { if (vis[u]) return 0; siz[u] = 1; for(auto e : adj[u]) { auto [v, w] = e; if (v == p) continue; siz[u] += find_size(v, u); } return siz[u]; } int find_centroid(int u, int p, int n) { for(auto e : adj[u]) { auto [v, w] = e; if (v == p) continue; if (!vis[v] && siz[v] > n / 2) return find_centroid(v, u, n); } return u; } void init_centroid(int u = 0, int p = -1, int w = 0) { find_size(u); int c = find_centroid(u, -1, siz[u]); vis[c] = 1; par[c] = p, W[c] = w; // cout << c << " -> " << p << endl; for(auto e : adj[c]) { auto [v, wv] = e; if (vis[v]) continue; init_centroid(v, c, wv); } } void Init(int N, int A[], int B[], int D[]) { for(int i = 0; i < N; i++) { vis[i] = 0; par[i] = -1; siz[i] = W[i] = 0; dx[i] = dy[i] = INFL; adj[i] = {}; } 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]}); } init_centroid(); } ll Query(int S, int X[], int T, int Y[]) { vector<int> alt; for(int i = 0; i < S; i++) { int u = X[i]; // cout << u << endl; dx[u] = 0; alt.push_back(u); while(par[u] != -1) { // cout << "PARS: " << u << endl; dx[par[u]] = min(dx[par[u]], dx[u] + W[u]); alt.push_back(u = par[u]); } // cout << "PARS: " << u << endl; } for(int i = 0; i < T; i++) { int u = Y[i]; // cout << u << endl; dy[u] = 0; alt.push_back(u); while(par[u] != -1) { // cout << "PART: " << u << endl; dy[par[u]] = min(dy[par[u]], dy[u] + W[u]); alt.push_back(u = par[u]); } // cout << "PART: " << u << endl; } sort(begin(alt), end(alt)); alt.erase(unique(begin(alt), end(alt)), end(alt)); ll ans = INFL; for(auto u : alt) { // cout << u << " " << dx[u] << " + " << dy[u] << endl; ans = min(ans, dx[u] + dy[u]); dx[u] = dy[u] = INFL; } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...