Submission #1065298

#TimeUsernameProblemLanguageResultExecution timeMemory
1065298vjudge1Factories (JOI14_factories)C++17
0 / 100
62 ms90960 KiB
#include "factories.h" #include <bits/stdc++.h> #define ll long long #define pb push_back using namespace std; int up(int n, int k); void DFS(int n); void dijkstra(int n); ll inf = LONG_LONG_MAX; int n; vector<vector<pair<int, ll>>> adj(500005); vector<bool> vis(500005, 0); vector<ll> dis(500005, inf), h(500005,0), parent(500005,0); vector<pair<ll,ll>> outdeg(500005,{0,0}); priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> pq; vector<vector<int>> sparseT(500005, vector<int>(19)); void Init(int N, int A[], int B[], int D[]) { n = N; for (int i = 0; i < N - 1; i++) { adj[A[i]].pb({B[i], D[i]}); adj[B[i]].pb({A[i], D[i]}); outdeg[A[i]].first++; outdeg[A[i]].second = A[i]; outdeg[B[i]].first++; outdeg[B[i]].second = B[i]; } sort(outdeg.rbegin(),outdeg.rend()); //cout<<outdeg[0].second<<endl; dijkstra(outdeg[0].second); parent[outdeg[0].second] = outdeg[0].second; DFS(outdeg[0].second); for(int i=0; i < N; i++){ sparseT[i][0] = parent[i]; } for(int j=1; j < 20; j++){ for(int i=0; i < N; i++){ sparseT[i][j] = parent[sparseT[i][j-1]]; } } } long long Query(int S, int X[], int T, int Y[]) { ll ans = inf; for (int i = 0; i < S; i++){ for(int j = 0; j < T; j++){ int aux1=X[i],aux2=Y[j]; while(h[aux1] > h[aux2]){ aux1 = parent[aux1]; } while(h[aux1] < h[aux2]){ aux2 = parent[aux2]; } for(int k = 1; k <= h[aux1]; k++){ if(up(aux1,k) == up(aux2,k)){ ans = min(ans,(dis[X[i]]+dis[Y[j]])-dis[up(aux1,k)]); break; } } } } return ans; } int up(int n1, int k){ int act=n1; for(int p=0; p < 20; p++){ if(k & (1<<p)){ act = sparseT[act][p]; } } return act; } void DFS(int n1){ vis[n1] = 1; for(auto [x,w]: adj[n1]){ if(vis[x])continue; h[x] = h[n1]+1; parent[x] = n; DFS(x); } } void dijkstra(int n1) { dis[n1] = 0; pq.push({0,n1}); while (!pq.empty()) { int a = pq.top().second; pq.pop(); if (vis[a]) continue; vis[a] = 1; for (auto [b, w] : adj[a]) { if (dis[b] > dis[a] + w) { dis[b] = dis[a] + w; pq.push({dis[b], b}); } } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...