Submission #1250898

#TimeUsernameProblemLanguageResultExecution timeMemory
1250898neisennEvacuation plan (IZhO18_plan)C++20
0 / 100
22 ms7500 KiB
#include <bits/stdc++.h> using namespace std; #define pb push_back #define eb emplace_back #define ppb pop_back #define fi first #define se second typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef pair<int, int> pii; typedef pair<ll, int> pli; typedef pair<ll, ll> pll; const char nl = '\n'; const int inf = 1e9; struct DSU { vector<int> par, sz; DSU (int n){ par.resize(n+1); sz.assign(n+1, 1); iota(par.begin(), par.end(), 0); } int find(int x){ if (par[x] == x) return x; return par[x] = find(par[x]); } bool uni(int a, int b){ a = find(a), b = find(b); if (a == b) return 0; if (sz[a] < sz[b]) swap(a, b); sz[a] += par[b], par[b] = a; return 1; } bool is(int a, int b){ return find(a) == find(b); } }; void solve(){ int n, m, u, v, w; cin >> n >> m; vector<vector<vector<int>>> adj(n+1); vector<vector<int>> ed; for (int i = 0; i < m; i++){ cin >> u >> v >> w; adj[u].pb({v, w}); adj[v].pb({u, w}); ed.pb({u, v}); } vector<int> dis(n+1, inf); set<vector<int>> s; int k; cin >> k; for (int i = 1; i <= k; i++){ cin >> u; dis[u] = 0; s.insert({0, u}); } while (s.size()){ int cur = s.begin()->at(1), d = s.begin()->at(0); s.erase(s.begin()); if (d != dis[cur]) continue; for (auto ch : adj[cur]){ if (dis[ch[0]] > dis[cur]+ch[1]){ dis[ch[0]] = dis[cur]+ch[1]; s.insert({dis[ch[0]], ch[0]}); } } } for (int i = 0; i < m; i++){ ed[i].pb(min(dis[ed[i][0]], dis[ed[i][1]])); swap(ed[i][0], ed[i][2]); } sort(ed.begin(), ed.end()); reverse(ed.begin(), ed.end()); int q; cin >> q; vector<vector<int>> qu; for (int i = 1; i <= q; i++){ cin >> u >> v; qu.pb({0, inf, -1, u, v}); } int it = 30; while (it--){ vector<vector<int>> lst; for (int i = 0; i < q; i++){ if (qu[i][0] > qu[i][1]) continue; int mid = (qu[i][0]+qu[i][1])/2; lst.pb({mid, i}); } sort(lst.rbegin(), lst.rend()); DSU dsu(n); int id = 0; for (auto ch : lst){ int a = ch[1]; while (id < m && ed[id][0] >= ch[0]){ dsu.uni(ed[id][1], ed[id][2]); id++; } if (dsu.is(qu[a][3], qu[a][4])){ qu[a][2] = ch[0]; qu[a][0] = ch[0]+1; } else { qu[a][1] = ch[0]-1; } } } for (int i = 0; i < q; i++){ cout << qu[i][2] << nl; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t = 1; cin >> t; while (t--){ 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...