제출 #1209547

#제출 시각아이디문제언어결과실행 시간메모리
1209547asdfghqwertEvacuation plan (IZhO18_plan)C++20
100 / 100
1293 ms55888 KiB
#include <bits/stdc++.h> #pragma GCC optimize("Ofast") using namespace std; typedef long long ll; const int maxn = 3e5 + 1 , delta = 66529; #define int long long int int32_t main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n , m ; cin >> n >> m; vector<vector<pair<int , int>>> g(n + 1); for(int i = 1 ; i <= m ; i++){ int u , v , w; cin >> u >> v >> w; g[u].push_back({v, w}); g[v].push_back({u, w}); } int k; cin >> k; vector<int> k_nodes(k) , dis(n + 1, LLONG_MAX); priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; for(int i = 0 ; i < k ; i++) { cin >> k_nodes[i]; dis[k_nodes[i]] = 0; pq.push({0, k_nodes[i]}); } while(!pq.empty()) { auto [d, u] = pq.top(); pq.pop(); if(d > dis[u]) continue; for(auto [v, w] : g[u]) { if(dis[v] > dis[u] + w) { dis[v] = dis[u] + w; pq.push({dis[v], v}); } } } vector<pair<int , int>> sorted_dis(n + 1); for(int i = 1 ; i <= n ; i++) sorted_dis[i] = {dis[i], i}; sort(sorted_dis.begin() + 1, sorted_dis.end()); int q; cin >> q; vector<pair<int , int>> queries(q) , ranges(q , {1 , n}); for(int i = 0 ; i < q ; i++) { cin >> queries[i].first >> queries[i].second; } bool isfinished = false; vector<vector<int>> pos(n + 1); while(isfinished == false) { isfinished = true; // Clear pos for each iteration for(int i = 1; i <= n; i++) pos[i].clear(); for(int i = 0 ; i < q ; i++) { if(ranges[i].first != ranges[i].second) { isfinished = false; int mid = (ranges[i].first + ranges[i].second + 1) / 2; pos[mid].push_back(i); } } //dsu vector<int> parent(n + 1); for(int i = 1 ; i <= n ; i++) { parent[i] = i; } function<int(int)> find = [&](int x) { if(parent[x] != x) { parent[x] = find(parent[x]); } return parent[x]; }; for(int i = n ; i >= 1 ; i--){ int u = sorted_dis[i].second; for(auto [v, w] : g[u]) { if(dis[v] >= dis[u]) { int pu = find(u); int pv = find(v); if(pu != pv) { parent[pu] = pv; } } } for(auto idx : pos[i]) { auto [l, r] = ranges[idx]; if(l == r) continue; int mid = (l + r + 1) / 2; auto [x, y] = queries[idx]; if(find(x) == find(y)) { ranges[idx].first = mid; } else { ranges[idx].second = mid - 1; } } } } for(int i = 0 ; i < q ; i++) { cout << sorted_dis[ranges[i].first].first << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...