Submission #39367

#TimeUsernameProblemLanguageResultExecution timeMemory
39367MatheusLealVSightseeing (NOI14_sightseeing)C++14
9 / 25
1879 ms171652 KiB
#include <bits/stdc++.h> #define f first #define s second #define N 500010 #define logn 20 using namespace std; typedef pair<int, int> pii; int n, m, q, anc[N][logn], pai[N], peso[N], dist[N][logn], nivel[N]; vector<pii> grafo[N]; vector< pair<int, pii> > A; void dfs(int x, int p) { for(auto v: grafo[x]) { if(v.f == p) continue; anc[v.f][0] = x; dist[v.f][0] = v.s; nivel[v.f] = nivel[x] + 1; dfs(v.f, x); } } int Find(int x) { if(x == pai[x]) return x; return pai[x] = Find(pai[x]); } void join(int a, int b) { if(peso[a] >= peso[b]) swap(a, b); pai[a] = b; if(peso[a] == peso[b]) peso[b] ++; } inline int solve(int u, int v) { if(nivel[u] < nivel[v]) swap(u, v); int resp = 2000000000; for(int i = logn - 1; i >= 0; i--) if(nivel[u] - (1<<i) >= nivel[v]) resp = min(resp, dist[u][i]), u = anc[u][i]; if(u == v) return resp; for(int i = logn - 1; i >= 0; i--) if(anc[u][i] != -1 && anc[u][i] != anc[v][i]) resp = min(min(resp, dist[u][i]), dist[v][i]), u = anc[u][i], v = anc[v][i]; return min(min(resp, dist[u][0]), dist[v][0]); } void init() { memset(anc, -1, sizeof anc); memset(dist, 0x3f3f3f3f,sizeof dist); dfs(1, 1); for(int j = 1; j < logn; j++) for(int i = 1; i <= n; i++) { if(anc[i][j - 1] != -1) anc[i][j] = anc[ anc[i][j - 1] ][j - 1]; if(anc[i][j - 1] != -1) dist[i][j] = min(dist[i][j - 1], dist[ anc[i][j - 1] ][j - 1]); } } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>m>>q; for(int i = 1, a, b, c; i <= m; i++) { cin>>a>>b>>c; A.push_back(make_pair(c, pii(a, b))); } sort(A.rbegin(), A.rend()); for(int i = 1; i <= n; i++) pai[i] = i; for(auto p: A) { int a = Find(p.s.f), b = Find(p.s.s); if(a == b) continue; join(a, b); grafo[a].push_back(pii(b, p.f)); grafo[b].push_back(pii(a, p.f)); } init(); while(q--) { int x; cin>>x; cout<<solve(1, x)<<"\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...