Submission #1293062

#TimeUsernameProblemLanguageResultExecution timeMemory
1293062tormentFactories (JOI14_factories)C++20
100 / 100
2479 ms331524 KiB
#include "factories.h" #include <bits/stdc++.h> using namespace std; const int N = 5e5 + 5; vector<array<int, 2>>G[N]; vector<array<long long, 2>>C[N]; bool del[N]; int tsz[N]; long long f[N]; void findsz(int node, int par){ tsz[node] = 1; for(auto &[v, w] : G[node]){ if(v == par || del[v])continue; findsz(v, node); tsz[node] += tsz[v]; } } int findcent(int node, int par, int T){ int mx = -1; for(auto &[v, w] : G[node]){ if(v == par || del[v])continue; if(mx == -1 || tsz[mx] < tsz[v]){ mx = v; } } if(mx == -1 || tsz[mx] <= T / 2)return node; return findcent(mx, node, T); } void populC(int node, int par, int cent, long long d){ C[node].push_back({cent, d}); for(auto &[v, w] : G[node]){ if(v == par || del[v])continue; populC(v, node, cent, d + w); } } void decompose(int node){ findsz(node, node); int cent = findcent(node, node, tsz[node]); populC(cent, cent, cent, 0); del[cent] = 1; for(auto &[v, w] : G[cent]){ if(del[v])continue; decompose(v); } } void Init(int N, int A[], int B[], int D[]){ for(int i = 0;i < N - 1;++i){ G[A[i]].push_back({B[i], D[i]}); G[B[i]].push_back({A[i], D[i]}); } decompose(0); for(int i = 0;i < N;++i){ f[i] = 1e18; } } long long Query(int S, int X[], int T, int Y[]){ for(int i = 0;i < S;++i){ for(auto &[node, dist] : C[X[i]]){ f[node] = min(f[node], dist); } } long long mn = 1e18; for(int i = 0;i < T;++i){ for(auto &[node, dist] : C[Y[i]]){ mn = min(mn, dist + f[node]); } } for(int i = 0;i < S;++i){ for(auto &[node, dist] : C[X[i]]){ f[node] = 1e18; } } return mn; } // int main(){ // ios_base::sync_with_stdio(0); // cin.tie(0); // int n, q; // cin >> n >> q; // int a[n - 1], b[n - 1], d[n - 1]; // for(int i = 0;i < n - 1;++i){ // cin >> a[i] >> b[i] >> d[i]; // } // Init(n, a, b, d); // while(q--){ // int s, t; // cin >> s >> t; // int x[s], y[t]; // for(int i = 0;i < s;++i){ // cin >> x[i]; // } // for(int i = 0;i < t;++i){ // cin >> y[i]; // } // cout << Query(s, x, t, y) << '\n'; // } // }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...