Submission #836092

#TimeUsernameProblemLanguageResultExecution timeMemory
836092yeediotValley (BOI19_valley)C++14
0 / 100
91 ms46124 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define F first #define S second #define all(x) x.begin(),x.end() #define pii pair<int,int> #define pb push_back #define sz(x) (int)(x.size()) #define chmin(x,y) x=min(x,y) #define chmax(x,y) x=max(x,y) #define vi vector<int> #define vp vector<pii> #define vvi vector<vi> const int mxn=1e5+5; struct edge{ int v,u,d; }; vector<edge>ed; vector<pii>adj[mxn]; bool is_shop[mxn]; int dis[mxn]; int jump[20][mxn]; int mn[20][mxn]; int magic[mxn]; int dep[mxn]; int timer=0; int in[mxn],out[mxn]; void calc_dis(int v,int pa){ //cout<<v<<' '; jump[0][v]=pa; in[v]=++timer; dep[v]=dep[pa]+1; for(auto u:adj[v]){ if(u.F==pa)continue; dis[u.F]=u.S+dis[v]; calc_dis(u.F,v); chmin(magic[v],magic[u.F]); } out[v]=timer; } void dfs(int v,int pa){ if(is_shop[v])magic[v]=dis[v]; else magic[v]=8e18; for(auto u:adj[v]){ if(u.F==pa)continue; dfs(u.F,v); chmin(magic[v],magic[u.F]); } } signed main(){ ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); int n,s,q,e; cin>>n>>s>>q>>e; ed.pb({0,0,0}); for(int i=1;i<n;i++){ int v,u,d; cin>>v>>u>>d; ed.pb({v,u,d}); adj[v].pb({u,d}); adj[u].pb({v,d}); } for(int i=0;i<s;i++){ int x; cin>>x; is_shop[x]=1; } dis[e]=0; calc_dis(e,0); dfs(e,0); for(int i=1;i<=n;i++){ magic[i]-=2*dis[i]; // cout<<magic[i]<<' '; } for(int i=1;i<=n;i++){ mn[0][i]=magic[jump[0][i]]; } for(int i=1;i<20;i++){ for(int j=1;j<=n;j++){ jump[i][j]=jump[i-1][jump[i-1][j]]; mn[i][j]=min(mn[i-1][j],mn[i-1][jump[i-1][j]]); } } while(q--){ int id,p; cin>>id>>p; int top=(dep[ed[id].v]>dep[ed[id].u]?ed[id].v:ed[id].u); if(in[top]<=in[p] and out[top]>=out[p]){ int dif=dep[p]-dep[top]; int ans=magic[p]; //cout<<magic[p]<<' '<<dis[p]<<' '; int x=dis[p]; for(int i=0;i<20;i++){ if(dif>>i&1){ chmin(ans,mn[i][p]); p=jump[i][p]; } } if(ans>=1e18)cout<<"oo\n"; else cout<<x+ans<<'\n'; } else{ cout<<"esacped\n"; } } } /* input: */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...