Submission #173248

#TimeUsernameProblemLanguageResultExecution timeMemory
173248LinusTorvaldsFanEvacuation plan (IZhO18_plan)C++14
100 / 100
1404 ms41924 KiB
#include <iostream> #include <vector> #include <memory.h> #include <unordered_set> #include <algorithm> #include <set> using namespace std; typedef long long ll; const int maxn=100010; vector<pair<int,int>> G[maxn]; int dist[maxn]; int dsu[maxn]; int sz[maxn]; struct DSU{ DSU(int n){ for(int i=1;i<=n;i++)dsu[i]=i,sz[i]=1; } int find(int v){ if(dsu[v]==v)return v; return dsu[v]=find(dsu[v]); } void merge(int a,int b){ a=find(a); b=find(b); if(a==b)return; if(sz[a]>sz[b]){ sz[a]+=sz[b]; dsu[b]=a; } else{ sz[b]+=sz[a]; dsu[a]=b; } } }; bool added[maxn]; signed main(){ memset(dist,63,sizeof(dist)); ios_base::sync_with_stdio(0);cin.tie(0); int n; cin>>n; int m; cin>>m; for(int i=0;i<m;i++){ int u,v,w; cin>>u>>v>>w; G[u].emplace_back(v,w); G[v].emplace_back(u,w); } int k; cin>>k; dist[0]=0; for(int i=0;i<k;i++){ int x;cin>>x; G[0].emplace_back(x,0); } set<pair<int,int>> dijkstra; dijkstra.emplace(0,0); while(dijkstra.size()){ int d=dijkstra.begin()->first; int v=dijkstra.begin()->second; dijkstra.erase(dijkstra.begin()); if(d!=dist[v])continue; for(auto &edge:G[v]){ int u=edge.first; int w=edge.second; if(dist[u]>d+w){ dijkstra.erase({dist[u],u}); dist[u]=d+w; dijkstra.emplace(dist[u],u); } } } vector<pair<int,int>> vertexes; for(int v=1;v<=n;v++)vertexes.emplace_back(dist[v],v); sort(vertexes.rbegin(),vertexes.rend()); int q; cin>>q; vector<pair<int,int>> que; for(int i=0;i<q;i++){ int a,b; cin>>a>>b; que.emplace_back(a,b); } vector<pair<int,int>> bin_search(q); for(int i=0;i<q;i++)bin_search[i]={0,n-1}; vector<vector<int>>queries(n); for(int t=0;t<17;t++){ for(int i=0;i<n;i++)queries[i].clear(); for(int i=0;i<q;i++){ int m=(bin_search[i].first+bin_search[i].second)>>1; queries[m].emplace_back(i); } DSU dsu(n); memset(added,0,sizeof(added)); for(int i=0;i<n;i++){ int cur_v=vertexes[i].second; for(auto &edge:G[cur_v]){ int u=edge.first; if(added[u]) dsu.merge(u,cur_v); } added[cur_v]=true; for(auto &query:queries[i]){ int a=que[query].first; int b=que[query].second; if(!added[a]||!added[b]){ bin_search[query].first=i; } else { if(dsu.find(a)!=dsu.find(b)){ bin_search[query].first=i; }else{ bin_search[query].second=i; } } } } } for(int i=0;i<q;i++){ cout<<vertexes[bin_search[i].second].first<<"\n"; } 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...