Submission #1184331

#TimeUsernameProblemLanguageResultExecution timeMemory
1184331HasanV11010238Evacuation plan (IZhO18_plan)C++20
22 / 100
4098 ms156940 KiB
#include <bits/stdc++.h> #define ll long long #define INF 100000000 #define MAX 200001 using namespace std; struct DSU{ vector<int> p; DSU(int n){ p.assign(n + 1, -1); } int find(int x){ if (p[x] < 0) return x; return p[x] = find(p[x]); } int merge(int a, int b){ a = find(a); b = find(b); if (a == b) return 0; if (p[a] > p[b]) swap(a, b); p[a] += p[b]; p[b] = a; return 1; } bool iss(int a, int b){ return find(a) == find(b); } }; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m, k, q, a, b, c; cin>>n>>m; vector<vector<vector<int>>> v(n + 1); vector<vector<int>> edg; for (int i = 0; i < m; i++){ cin>>a>>b>>c; v[a].push_back({b, c}); v[b].push_back({a, c}); edg.push_back({a, b}); } vector<int> di(n + 1, INF); set<vector<int>> se; cin>>k; for (int i = 1; i <= k; i++){ cin>>a; di[a] = 0; se.insert({0, a}); } while (!se.empty()){ int x = se.begin()->at(1), dd = se.begin()->at(0); se.erase(se.begin()); if (dd != di[x]) continue; for (auto el : v[x]){ if (di[el[0]] > di[x] + el[1]){ di[el[0]] = di[x] + el[1]; se.insert({di[el[0]], el[0]}); } } } for (int i = 0; i < m; i++){ edg[i].push_back(min(di[edg[i][0]], di[edg[i][1]])); swap(edg[i][0], edg[i][2]); } cin>>q; vector<vector<int>> qu; for (int i = 1; i <= q; i++){ cin>>a>>b; qu.push_back({0, INF, -1, a, b}); } int lo = 30; while (lo--){ vector<vector<int>> so; for (int i = 0; i < q; i++){ if (qu[i][0] > qu[i][1]) continue; int mid = (qu[i][0] + qu[i][1]) / 2; so.push_back({mid, i}); } for (int i = 0; i < m; i++){ so.push_back({edg[i][0], INF + 1, edg[i][1], edg[i][2]}); } sort(so.begin(), so.end()); reverse(so.begin(), so.end()); DSU ds(n); for (auto el : so){ if (el[1] == INF + 1){ ds.merge(el[2], el[3]); } else{ int a = el[1]; if (ds.iss(qu[a][3], qu[a][4])){ qu[a][2] = el[0]; qu[a][0] = el[0] + 1; } else{ qu[a][1] = el[0] - 1; } } } } for (int i = 0; i < q; i++){ cout<<qu[i][2]<<"\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...