Submission #1149835

#TimeUsernameProblemLanguageResultExecution timeMemory
1149835aktilekEvacuation plan (IZhO18_plan)C++20
100 / 100
396 ms72252 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define F first #define S second #define pb push_back #define all(v) v.begin(), v.end() #define rall(v) v.rbegin(), v.rend() #define Fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); const int N = 1e6 + 7; const int R = 1e9 + 10; const ll INF = 1e18; const ll MOD = 1e9 + 7; const int B = 320; vector < pair < int, int >> g[N]; bool used[N]; ll dist[N]; int l[N], r[N], s[N], t[N]; int par[N], sz[N]; map < int , vector < pair < int, int >> > kanye; // vector < pair < int, int > > kanye[6000000]; int ans[N]; int get(int x) { if (par[x] == x) return x; return par[x] = get(par[x]); } void unite(int x, int y) { x = get(x); y = get(y); if (x == y) return; if (sz[x] < sz[y]) swap(x, y); sz[x] += sz[y]; par[y] = x; } void solve() { int n, m; cin >> n >> m; vector < pair < int, int >> edge; for (int i = 1; i <= m; i++) { int u, v, w; cin >> u >> v >> w; edge.pb({u, v}); g[u].pb({v, w}); g[v].pb({u, w}); } int atom; cin >> atom; for (int i = 1;i <= n; i++) { dist[i] = INF; } priority_queue < pair < int, int > > q; for (int i = 1; i <= atom; i++) { int x; cin >> x; q.push({0, x}); dist[x] = 0; } while (q.size()) { int a = q.top().S; q.pop(); if (used[a]) continue; used[a] = true; for (auto v : g[a]) { int b = v.F, w = v.S; if (dist[a] + w < dist[b]) { dist[b] = dist[a] + w; q.push({-dist[b], b}); } } } vector < pair < int, pair < int, int >>> edges; for (int i = 0; i < m; i++) { int d = min(dist[edge[i].F], dist[edge[i].S]); edges.pb({d, {edge[i].F, edge[i].S}}); } sort(rall(edges)); vector < int > west; for (auto ye : edges) { // cout << ye.F << ' ' << ye.S.F << ' ' << ye.S.S << '\n'; kanye[ye.F].pb({ye.S.F, ye.S.S}); if (west.size() == 0 || west.back() != ye.F) { west.pb(ye.F); } } // for (int x : west) cout << x << ' '; int z; cin >> z; for (int i = 1; i <= z; i++) { cin >> s[i] >> t[i]; l[i] = 0, r[i] = int(west.size()) - 1; } int steps = 30; while (steps--) { vector < int > requests[m + 7]; for (int i = 1; i <= z; i++) { if (l[i] > r[i]) continue; int mid = (l[i] + r[i]) / 2; requests[mid].pb(i); } for (int i = 1; i <= n; i++) { par[i] = i; sz[i] = 1; } for (int i = 0; i < west.size(); i++) { for (auto x : kanye[west[i]]) { unite(x.F, x.S); } for (int j : requests[i]) { if (get(s[j]) == get(t[j])) { ans[j] = west[i]; r[j] = i - 1; } else { l[j] = i + 1; } } } } for (int i = 1; i <= z; i++) { cout << ans[i] << '\n'; } } int main() { // freopen("gates.in", "r", stdin); // freopen("gates.out", "w", stdout); Fast int tc = 1; // cin >> tc; while (tc--) { solve(); } }
#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...