제출 #544323

#제출 시각아이디문제언어결과실행 시간메모리
544323somoEvacuation plan (IZhO18_plan)C++14
100 / 100
570 ms101684 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/tree_policy.hpp> #include <ext/pb_ds/assoc_container.hpp> #define ll long long #define pb push_back #define endl '\n' #define pii pair<ll,ll> #define F first #define S second #define double long double #define all(x) (x).begin(),(x).end() using namespace std; using namespace __gnu_pbds; typedef tree<ll , null_type , less_equal<ll> ,rb_tree_tag ,tree_order_statistics_node_update >ordered_set; const int MOD = 1e9 + 7; const int N=5e5 + 7 ; const ll INF= 1e18+10; struct trp{ll F,S,T;}; ll po(ll x,ll y) { ll ans = 1; while(y){ if( y & 1 ) ans *=x; y /= 2; x *=x; x %= MOD; ans %= MOD; } return ans; } ll p[N]; ll vis[N]; ll ans[N]; bool is[N]; ll n , m , qu; set<ll> dsu[N]; vector<pii>v[N]; vector<pii> que[N]; ll root(ll x) { return p[x] == x ? x : p[x] = root(p[x]); } void mer(ll x,ll y,ll hehe) { x = root(x); y = root(y); if(x == y) return; if(dsu[x].size() > dsu[y].size()) swap(x,y); for(auto i : dsu[x]){ for(auto j : que[i]){ if(dsu[y].find(j.F) != dsu[y].end()) ans[j.S] = hehe; } } for(auto i : dsu[x]) dsu[y].insert(i); p[x] = y; } bool cmp(pii a,pii b) { return a.F < b.F; } void solve() { cin >> n >> m ; for(ll i= 1; i <= m ; i ++){ ll x,y,z; cin >> x >> y >> z; v[x].pb({y,z}); v[y].pb({x,z}); } for(ll i= 1; i <= n ; i ++){ vis[i] = 1e17; p[i] = i; dsu[i].insert(i); } priority_queue<pii,vector<pii>,greater<pii>>q; ll k; cin >> k; while(k -- ){ ll x; cin >> x; vis[x] = 0; q.push({0,x}); } while(q.size()){ pii x = q.top(); q.pop(); if(x.F != vis[x.S]) continue; for(auto i : v[x.S]){ if(vis[i.F] > x.F + i.S){ vis[i.F] = x.F + i.S; q.push({vis[i.F] , i.F}); } } } vector<pii>vec; for(ll i= 1; i <= n ; i ++){ vec.pb({vis[i] , i}); } sort(all(vec) , cmp); cin >> qu; for(ll i= 1; i <= qu ; i ++){ ll x,y; cin >> x >> y; que[x].pb({y,i}); que[y].pb({x,i}); } while(vec.size()){ ll node = vec.back().S , hehe = vec.back().F; is[node] = 1; vec.pop_back(); for(auto i : v[node]){ if(!is[i.F]) continue; mer(node , i.F , hehe); } } for(ll i= 1; i <= qu ; i ++) cout << ans[i] << endl; } int main(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); //freopen(".in" , "r" , stdin);freopen(".out" , "w" , stdout); 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...