Submission #125549

#TimeUsernameProblemLanguageResultExecution timeMemory
125549The_WolfpackValley (BOI19_valley)C++14
100 / 100
505 ms48376 KiB
#include <bits/stdc++.h> #define pii pair<int,int> #define x first #define y second #define ll long long using namespace std; const int NMAX=1e5+7; const int LogNMAX=25; const ll INF=1e18; int n,s,q,E,tin[NMAX],tout[NMAX],par[LogNMAX][NMAX],lvl[NMAX]; vector<pii> g[NMAX]; ll dp[NMAX], dep[NMAX], mn[LogNMAX][NMAX]; struct edge{int a,b,w;}; edge e[NMAX]; int Time=0; void Dfs(int son, int p, ll D) { tin[son]=++Time; par[0][son]=p; dep[son]=D; for(pii i:g[son]) { if(i.x==p) continue; lvl[i.x]=lvl[son]+1; Dfs(i.x, son, D+1LL*i.y); dp[son]=min(dp[son],dp[i.x]+1LL*i.y); } tout[son]=Time; } int ok(int A, int B) { return tin[B]<=tin[A] && tout[B]>=tout[A]; } int main() { ios_base::sync_with_stdio(false); cin>>n>>s>>q>>E; for(int i=0;i<=n;i++) dp[i]=INF; for(int i=1;i<=n-1;i++) { cin>>e[i].a>>e[i].b>>e[i].w; g[e[i].a].push_back({e[i].b, e[i].w}); g[e[i].b].push_back({e[i].a, e[i].w}); } while(s--) { int c; cin>>c; dp[c]=0; } Dfs(E,0,0); for(int i=1;i<=n;i++) if(par[0][e[i].a]==e[i].b) swap(e[i].a, e[i].b); for(int i=1;i<=n;i++) mn[0][i]=dp[i]-dep[i]; for(int i=1;i<LogNMAX;i++) for(int 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]]); } while(q--) { int idx,node; cin>>idx>>node; idx=e[idx].b; if(!ok(node,idx)) { cout<<"escaped"<<endl; continue; } ll res=INF; int idi=lvl[node]-lvl[idx]+1; int tmp=node; for(int i=0;i<LogNMAX;i++) { if(idi&(1<<i)) { res=min(res,mn[i][node]); node=par[i][node]; } } res+=dep[tmp]; if(res>1e17+20) cout<<"oo"<<endl; else cout<<res<<endl; } 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...