제출 #543527

#제출 시각아이디문제언어결과실행 시간메모리
543527SavicSEvacuation plan (IZhO18_plan)C++17
100 / 100
1625 ms30960 KiB
#include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #include <bits/stdc++.h> using namespace std; using namespace __gnu_pbds; typedef long long ll; typedef long double ld; typedef pair<int,int> pii; typedef pair<ll,ll> pll; typedef pair<ld,ld> pdd; #define ff(i,a,b) for(int i = a; i <= b; i++) #define fb(i,b,a) for(int i = b; i >= a; i--) #define trav(a,x) for (auto& a : x) #define sz(a) (int)(a).size() #define pb push_back #define fi first #define se second #define lb lower_bound #define ub upper_bound #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); template<typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; // os.order_of_key(k) the number of elements in the os less than k // *os.find_by_order(k) print the k-th smallest number in os(0-based) const int mod = 1000000007; const int inf = 1e9 + 5; const int mxN = 100005; int n, m, k, q; pii upit[mxN]; vector<pii> g[mxN]; bool mark[mxN]; ll dist[mxN]; bool bio[mxN]; int L[mxN]; int R[mxN]; int ans[mxN]; int par[mxN], sz[mxN]; int findpar(int x){ return (x == par[x] ? x : par[x] = findpar(par[x])); } void unite(int x, int y){ x = findpar(x), y = findpar(y); if(x == y)return; if(sz[x] < sz[y])swap(x, y); par[y] = x; sz[x] += sz[y]; } int main() { cin.tie(0)->sync_with_stdio(0); cin >> n >> m; ff(i,1,m){ int u, v, w; cin >> u >> v >> w; g[u].pb({v, w}); g[v].pb({u, w}); } cin >> k; ff(i,1,k){ int X; cin >> X; mark[X] = 1; } cin >> q; ff(i,1,q)cin >> upit[i].fi >> upit[i].se; priority_queue<pll,vector<pll>,greater<pll>> pq; ff(i,1,n){ if(mark[i] == 1)pq.push({dist[i] = 0, i}); else dist[i] = inf; } while(sz(pq)){ pii v = pq.top(); pq.pop(); if(dist[v.se] < v.fi)continue; for(auto c : g[v.se]){ int u = c.fi; int w = c.se; if(dist[u] > w + v.fi){ pq.push({dist[u] = w + v.fi, u}); } } } ff(i,1,q)L[i] = 0, R[i] = inf, ans[i] = 0; ff(_,1,30){ vector<pii> eve; ff(i,1,q){ if(L[i] <= R[i]){ int mid = (L[i] + R[i]) / 2; eve.pb({mid, -i}); } } ff(i,1,n){ eve.pb({dist[i], i}); bio[i] = 0; par[i] = i; sz[i] = 1; } sort(rall(eve)); for(auto c : eve){ if(c.se < 0){ int u = upit[-c.se].fi; int v = upit[-c.se].se; if(findpar(u) == findpar(v)){ ans[-c.se] = c.fi; L[-c.se] = c.fi + 1; } else{ R[-c.se] = c.fi - 1; } } else{ bio[c.se] = 1; for(auto f : g[c.se]){ if(bio[f.fi])unite(f.fi, c.se); } } } } ff(i,1,q)cout << ans[i] << '\n'; return 0; } /* 9 12 1 9 4 1 2 5 2 3 7 2 4 3 4 3 6 3 6 4 8 7 10 6 7 5 5 8 1 9 5 7 5 4 12 6 8 2 2 4 7 5 1 6 5 3 4 8 5 8 1 5 // probati bojenje sahovski */
#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...