Submission #1280857

#TimeUsernameProblemLanguageResultExecution timeMemory
1280857WH8Evacuation plan (IZhO18_plan)C++20
100 / 100
845 ms47384 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define pll pair<int, int> #define mp make_pair #define pb push_back #define f first #define s second #define endl '\n' #define ld long double signed main(){ int n,m;cin>>n>>m; vector<vector<pair<int,int>>> al(n+1); vector<pair<int,int>> ed; for(int i=0;i<m;i++){ int a,b,c;cin>>a>>b>>c; al[a].pb({b,c}); al[b].pb({a, c}); ed.pb({a,b}); } int k;cin>>k; priority_queue<pll, vector<pll>,greater<pll>> pq; vector<int> dist(n+1, 1e15); for(int i=0;i<k;i++){ int c;cin>>c; dist[c]=0; pq.push({0, c}); } while(!pq.empty()){ auto [d, c] =pq.top();pq.pop(); if(dist[c]<d)continue; for(auto [to, w] : al[c]){ if(dist[to] > w+d){ dist[to]=w+d; pq.push({w+d, to}); } } } sort(ed.begin(),ed.end(), [&](auto a, auto b){ return min(dist[a.f], dist[a.s]) > min(dist[b.f], dist[b.s]); }); //~ for(int i=1;i<=n;i++){ //~ printf("dist of %lld is %lld\n",i,dist[i]); //~ } vector<int> p(2*n+5, 0); auto par=[&](auto par, int x) -> int{ if(p[x]==0)return x; return p[x]=par(par,p[x]); }; int q;cin>>q; vector<pair<int,int>> qs(q); vector<int> ans(q, 0); for(int i=0;i<q;i++)cin>>qs[i].f>>qs[i].s; queue<tuple<int,int,vector<int>>> bs; vector<int> temp(q); iota(temp.begin(),temp.end(),0ll); //~ for(auto it:temp)cout<<it<<endl; bs.push({-1, m-1, temp}); int ptr=0; while(!bs.empty()){ int l=get<0>(bs.front()), r=get<1>(bs.front()); //~ printf("%lld %lld\n",l,r); vector<int> cq=get<2>(bs.front()); bs.pop(); if(l==r-1){ for (auto qind : cq){ ans[qind]=min(dist[ed[r].f], dist[ed[r].s]); } continue; } vector<int> lo, hi; int m=(l+r)/2; if(m < ptr){ // reset p.assign(n+1, 0); ptr=0; } while (ptr <= m){ int pa=par(par, ed[ptr].f), pb=par(par, ed[ptr].s); if(pa!=pb){ //~ printf("merging %lld and %lld\n", pa, pb); p[pa]=pb; } ptr++; } for(auto qind:cq){ int pa=par(par,qs[qind].f), pb=par(par,qs[qind].s); //~ printf("qind %lld has %lld and %lld\n", qind,pa,pb); if(pa==pb){ lo.pb(qind); } else hi.pb(qind); } if(!lo.empty())bs.push({l,m,lo}); if(!hi.empty())bs.push({m,r,hi}); } for(int i=0;i<q;i++){ cout<<ans[i]<<"\n"; } } /* 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 */
#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...