Submission #1141389

#TimeUsernameProblemLanguageResultExecution timeMemory
1141389SSSMEvacuation plan (IZhO18_plan)C++20
19 / 100
393 ms129872 KiB
#include <bits/stdc++.h> /* #pragma GCC optimize("O3") #pragma GCC optimize("Ofast") #pragma GCC target ("avx2") */ using namespace std; /* #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; template<class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; */ #define F first #define S second #define pb push_back #define md(a) ((a%m+m)%m) #define all(a) a.begin(), a.end() #define MP make_pair #define lc (id<<1) #define rc (lc|1) #define mid (l+r)/2 #define kill(a) cout << a << "\n", exit(0) #define SZ(a) (ll)a.size() typedef pair<int,int> pii; typedef pair<long long ,long long> pll; typedef long long ll; typedef long double ld; typedef vector<vector<ll>> matrix; mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); ll const maxn=5e5+10, mod=1e9+7, INF=1e18, LOG=31, sq=65; ll poww(ll a, ll b, ll mod) { if (b == 0) return 1; return 1 * poww(1 * a * a % mod, b / 2, mod) * ((b % 2 == 1) ? a : 1) % mod; } ll n, m, q, k, P[maxn], sz[maxn], par[LOG][maxn], mn[LOG][maxn], dis[maxn], h[maxn]; vector<pll> g[maxn], adj[maxn]; vector<pair<ll, pll>> E; priority_queue<pll> pq; //<MST> void DSU() { for(ll i=0;i<maxn;i++){ P[i]=i; sz[i]=1; } } ll Find(ll v) { return P[v]==v?v:v=Find(P[v]); } bool Union(ll v, ll u) { if((v=Find(v))==(u=Find(u))) return 0; if(sz[v]<sz[u]) swap(v, u); P[u]=v; sz[v]+=sz[u]; return 1; } //</MST> //<Dij> void Dij() { while(SZ(pq)) { auto [d, v]=pq.top(); pq.pop(); d=-d; if(d!=dis[v]) continue; for(auto [u, w]:g[v]) { if(dis[u]>dis[v]+w) { dis[u]=dis[v]+w; pq.push({-dis[u], u}); } } } } //</Dij> // <LCA> void DFS(ll v, ll p=0) { for(auto [u, w]:adj[v]) { if(u!=p) { h[u]=h[v]+1; DFS(u, v); par[0][u]=v; mn[0][u]=w; } } } void Set_Par() { for(ll i=1;i<LOG;i++) { for(ll j=1;j<=n;j++) { par[i][j]=par[i-1][par[i-1][j]]; mn[i][j]=min(mn[i-1][j], mn[i-1][par[i-1][j]]); } } } pll Jump(ll v, ll r) { ll ans=INF; for(ll i=LOG-1;i>=0;i--) { if(r&(1ll<<i)) { ans=min(ans, mn[i][v]); v=par[i][v]; } } return {v, ans}; } ll LCA(ll v, ll u) { ll ans=INF; if(h[v]<h[u]) swap(v, u); ans=min(ans, Jump(v, h[v]-h[u]).S); v=Jump(v, h[v]-h[u]).F; if(v==u) return ans; for(ll i=LOG-1;i>=0;i--) { if(par[i][v]!=par[i][u]) { ans=min(ans, mn[i][v]); ans=min(ans, mn[i][u]); v=par[i][v]; u=par[i][u]; } } ans=min(ans, mn[0][v]); return ans; } // </LCA> int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m; for(ll i=1;i<=m;i++) { ll v, u, w; cin>>v>>u>>w; g[v].pb({u, w}); g[u].pb({v, w}); E.pb({0, {v, u}}); } cin>>k; fill(dis, dis+maxn, INF); for(ll i=1;i<=k;i++) { ll v; cin>>v; dis[v]=0; pq.push({0, v}); } Dij(); for(ll i=0;i<m;i++){ E[i].F=min(dis[E[i].S.F], dis[E[i].S.S]); // cout<<E[i].F<<" "<<E[i].S.F<<" "<<E[i].S.S<<"+++++++++\n"; } DSU(); sort(all(E)); reverse(all(E)); for(auto t:E) { ll v=t.S.F, u=t.S.S, w=t.F; if(Union(v, u)){ adj[v].pb({u, w}); adj[u].pb({v, w}); } } for(ll i=1;i<=n;i++) for(ll j=0;j<LOG;j++) mn[j][i]=INF; DFS(1); Set_Par(); cin>>q; while(q--) { ll v, u; cin>>v>>u; cout<<LCA(v, u)<<"\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...