Submission #1153955

#TimeUsernameProblemLanguageResultExecution timeMemory
1153955asdasdEvacuation plan (IZhO18_plan)C++20
100 / 100
670 ms32620 KiB
//gm --- akezhon #include <bits/stdc++.h> // #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3") // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") #define pb push_back #define pf push_front #define F first #define S second #define all(v) v.begin(),v.end() #define pii pair<int,int> #define tm (tl+tr)/2 #define TL v+v, tl, tm #define TR v+v+1, tm+1, tr #define DA l <= tl && tr <= r #define NE r < tl || tr < l #define double long double // #define int long long using namespace std; const int N=2e5+7; const int mod=1e9+7; const int inf=2e9; int n, m, q, k; int ans[N]; int l[N], r[N]; pii z[N]; int p[N]; int sz[N]; vector<pii>g[N]; int d[N]; bool ok[N]; vector<pair<int,pii>>reb; int dgt(int a){ if(a == p[a])return a; else return p[a] = dgt(p[a]); } void dun(int a, int b){ a=dgt(a); b=dgt(b); if(a==b)return; if(sz[a]>sz[b]){ p[b]=a; sz[a]+=sz[b]; } else{ p[a]=b; sz[b]+=sz[a]; } } void AlemAmenov(){ cin >> n >> m; for(int i=1; i <= m; i++){ int a, b, c; cin >> a >> b >> c; reb.pb({c,{a,b}}); g[a].pb({b,c}); g[b].pb({a,c}); } cin >> k; set<pii>st; for(int i=1; i <= n; i++)d[i]=inf; for(int x, i=1; i <= k; i++){ cin >> x; d[x]=0; st.insert({0, x}); } while(st.size()){ int v = st.begin()->S; st.erase(st.begin()); for(auto [u, w] : g[v]){ if(d[v]+w < d[u]){ st.erase({d[u], u}); d[u]=d[v]+w; st.insert({d[u], u}); } } } vector<pii>dist; int mxd=0; for(int i=1; i <= n; i++){ dist.pb({d[i], i}); mxd=max(mxd, d[i]); } sort(all(dist)); reverse(all(dist)); cin >> q; for(int i=1; i <= q; i++){ l[i]=0, r[i]=mxd; cin >> z[i].F >> z[i].S; } for(int op=1; op <= 30; op++){ vector<pii>v; for(int i=1; i <= q; i++){ if(l[i] <= r[i])v.pb({(l[i]+r[i])/2, i}); } sort(all(v)); reverse(all(v)); for(int i=1; i <= n; i++){ p[i]=i; sz[i]=1; ok[i]=0; } int cur=0; for(auto [mid, ind] : v){ while(cur < n && mid <= dist[cur].F){ int a = dist[cur].S; ok[a]=1; for(auto [u, w] : g[a]){ if(ok[u])dun(u, a); } cur++; } if(dgt(z[ind].F) == dgt(z[ind].S)){ ans[ind]=mid; l[ind]=mid+1; } else{ r[ind]=mid-1; } } } for(int i=1; i <= q; i ++){ cout << ans[i] << '\n'; } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); int RealName=1; // cin >> RealNam; // srand(time(0)); while(RealName--) AlemAmenov(); return 0; }
#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...