Submission #1161744

#TimeUsernameProblemLanguageResultExecution timeMemory
1161744son2008Valley (BOI19_valley)C++20
100 / 100
170 ms51120 KiB
#include<bits/stdc++.h> using namespace std; #define task "comseq" #define ii pair<ll,ll> #define fi first #define se second #define int long long #define ll long long #define ld double #define mp make_pair #define lg2 20 #define iii pair<int,ii> #define iiii pair<ii,ii> #define fii fi.fi #define fis fi.se3 #define sfi se.fi #define see se.se #define base 29 int dx[]={0LL,0LL,1,-1,1,1,-1,-1}; int dy[]={1,-1,0LL,0LL,1,-1,1,-1}; const int maxn=1e5+1; const int mod=1e9+7; int d[maxn],n,S,q,e,P_min[maxn][lg2+1],dp[maxn],P[maxn][lg2+1],h[maxn],dist[maxn]; ii b[maxn]; vector<ii>a[maxn]; void dfs(int u,int cha) { if(d[u])dp[u]=dist[u]; else dp[u]=1e18; for(ii v:a[u]) { if(v.fi==cha)continue; P[v.fi][0]=u; h[v.fi]=h[u]+1; dist[v.fi]=dist[u]+v.se; dfs(v.fi,u); dp[u]=min(dp[u],dp[v.fi]); } for(ii v:a[u]) { if(v.fi==cha)continue; P_min[v.fi][0]=dp[u]-2*dist[u]; // cout<<dp[u]<<" "<<dp[u]-2*dist[u]<<" "<<u<<'\n'; } } void build_lca(){ for(int j=1;j<=lg2;j++){ for(int i=1;i<=n;i++) if(P[i][j-1]!=0){ P[i][j]=P[P[i][j-1]][j-1]; P_min[i][j]=min(P_min[i][j-1],P_min[P[i][j-1]][j-1]); } } } int lca(int u,int v){ if(h[u]<h[v])swap(u,v); for(int i=lg2;i>=0;i--){ if(h[u]-h[v]>=(1<<i)) u=P[u][i]; } if(u==v){ return u; } for(int i=lg2;i>=0;i--){ if(P[u][i]!=P[v][i]){ u=P[u][i]; v=P[v][i]; } } return P[u][0]; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0); if(fopen(task".inp","r")){ freopen(task".inp","r",stdin); freopen(task".out","w",stdout);} cin>>n>>S>>q>>e; for(int i=1;i<n;i++) { int u,v,w; cin>>u>>v>>w; a[u].push_back({v,w}); a[v].push_back({u,w}); b[i]={u,v}; } for(int i=1;i<=S;i++) { int c;cin>>c; d[c]=1; } dfs(e,-1); build_lca(); //cout<<P_min[1][2]<<'\n'; while(q--) { int I,R; cin>>I>>R; int goc=R; int u=b[I].fi,v=b[I].se; if(h[u]>h[v])swap(u,v); if(lca(R,v)!=v) { cout<<"escaped"<<'\n'; } else { int ans=dp[goc]-dist[goc]; for(int j=lg2;j>=0;j--) { if((1<<j)<=h[R]-h[v]) { ans=min(ans,P_min[R][j]+dist[goc]); R=P[R][j]; } } if(ans>=1e15)cout<<"oo"<<'\n'; else cout<<ans<<'\n'; } } }

Compilation message (stderr)

valley.cpp: In function 'int main()':
valley.cpp:76:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   76 |     freopen(task".inp","r",stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
valley.cpp:77:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   77 |     freopen(task".out","w",stdout);}
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...