Submission #492353

#TimeUsernameProblemLanguageResultExecution timeMemory
492353phamhoanghiepEvacuation plan (IZhO18_plan)C++14
100 / 100
958 ms28604 KiB
#include<bits/stdc++.h> using namespace std; typedef pair<int,int> ii; typedef pair<int,ii> iii; const int maxn=1e5+5; const int inf=1e9+7; int n,m,q,k; int dist[maxn]; vector<int> qry[maxn*2]; ii qr[maxn]; int ans[maxn]; int l[maxn]; int r[maxn]; vector<ii> AdjList[maxn]; priority_queue<ii,vector<ii>,greater<ii>> pq; void dijkstra() { while(!pq.empty()) { ii tmp=pq.top(); pq.pop(); int d=tmp.first; int u=tmp.second; if(d>dist[u]) continue; for(ii x: AdjList[u]) { int v=x.first; int w=x.second; if(dist[v]>d+w) { dist[v]=d+w; pq.push(ii(dist[v],v)); } } } } // dsu int pset[maxn]; int sz[maxn]; vector<iii> edges; void init() { for(int i=1 ; i<=n ; i++) { pset[i]=i; sz[i]=1; } } int find_set(int s) { if(s==pset[s]) return s; else return pset[s]=find_set(pset[s]); } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>m; for(int i=1 ; i<=m ; i++) { int u,v,w; cin>>u>>v>>w; AdjList[u].push_back(ii(v,w)); AdjList[v].push_back(ii(u,w)); } for(int i=1 ; i<=n ; i++) dist[i]=inf; cin>>k; for(int i=1 ; i<=k ; i++) { int u; cin>>u; dist[u]=0; pq.push(ii(0,u)); } dijkstra(); cin>>q; for(int i=1 ; i<=q ; i++) { cin>>qr[i].first>>qr[i].second; l[i]=0; r[i]=inf; } vector<ii> vertex; for(int i=1 ; i<=n ; i++) { vertex.push_back(ii(dist[i],i)); } sort(vertex.rbegin(),vertex.rend()); for(int step=0 ; step<30 ; step++) { vector<ii> queries; init(); for(int i=1 ; i<=q ; i++) { int mid=(l[i]+r[i]+1)/2; queries.push_back(ii(mid,i)); } sort(queries.rbegin(),queries.rend()); int id=0; for(ii x: queries) { while(id<n&&vertex[id].first>=x.first) { for(ii tmp: AdjList[vertex[id].second]) { if(dist[tmp.first]<dist[vertex[id].second]) continue; int u=find_set(tmp.first); int v=find_set(vertex[id].second); if(u!=v) { if(sz[u]>sz[v]) swap(u,v); sz[v]+=sz[u]; pset[u]=v; } } id++; } if(find_set(qr[x.second].first)==find_set(qr[x.second].second)) { l[x.second]=x.first; } else r[x.second]=x.first-1; } } for(int i=1 ; i<=q ; i++) { cout<<l[i]<<'\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...