Submission #1303927

#TimeUsernameProblemLanguageResultExecution timeMemory
1303927WarinchaiValley (BOI19_valley)C++20
100 / 100
245 ms51124 KiB
#include<bits/stdc++.h> #define int long long using namespace std; vector<pair<int,int>>adj[100005]; int shop[100005]; int in[100005]; int out[100005]; int dis[100005]; int lv[100005]; int cur; int inf=1e15; int pa[20][100005]; int mn[20][100005]; int go[100005]; void dfs(int u,int p){ lv[u]=lv[p]+1; in[u]=++cur; dis[u]=inf; if(shop[u])dis[u]=0; for(auto [x,w]:adj[u])if(x!=p){ dfs(x,u); dis[u]=min(dis[u],dis[x]+w); } out[u]=cur; } void efs(int u,int p,int d){ go[u]=d; pa[0][u]=p; mn[0][u]=-d+dis[u]; //cerr<<"u:"<<u<<' '<<dis[u]<<" "<<mn[0][u]<<"\n"; for(int i=1;i<=19;i++)pa[i][u]=pa[i-1][pa[i-1][u]],mn[i][u]=min(mn[i-1][u],mn[i-1][pa[i-1][u]]); for(auto [x,w]:adj[u])if(x!=p){ efs(x,u,d+w); } } int fans(int u,int x){ int uu=u; int ans=inf; for(int i=19;i>=0;i--)if(lv[pa[i][u]]>=lv[x])ans=min(ans,mn[i][u]),u=pa[i][u]; ans=min(ans,mn[0][u]); //cerr<<"end:"<<u<<" "<<x<<":"<<ans<<"\n"; return ans+go[uu]; } int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(0); int n,s,q,e;cin>>n>>s>>q>>e; vector<pair<int,int>>v; for(int i=1;i<n;i++){ int a,b,w;cin>>a>>b>>w; adj[a].push_back({b,w}); adj[b].push_back({a,w}); v.push_back({a,b}); } for(int i=1;i<=s;i++){ int x;cin>>x; shop[x]=1; } dfs(e,0); efs(e,0,0); for(int i=0;i<q;i++){ int id,st;cin>>id>>st; int x=max(make_pair(lv[v[id-1].first],v[id-1].first),make_pair(lv[v[id-1].second],v[id-1].second)).second; //cerr<<x<<" "<<st<<"\n"; if(in[st]>=in[x]&&in[st]<=out[x]){ int ans=fans(st,x); if(ans>=inf)cout<<"oo\n"; else cout<<ans<<"\n"; }else{ cout<<"escaped\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...