제출 #1281991

#제출 시각아이디문제언어결과실행 시간메모리
1281991hanguyendanghuyValley (BOI19_valley)C++20
0 / 100
74 ms17152 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define fi first #define se second const ll MAXN=4e5+5,INF=1e18,MOD=1e9+7,MAXV=4e5+2; ll n,m,i,j,k,p,dem,cnt,ans,S,Q,root,dtr[MAXN],shop[MAXN],mark[MAXN],par[MAXN],dist[MAXN],chain[MAXN],headchain[MAXN],st[MAXN],en[MAXN],cntchain=1,de[MAXN],sz[MAXN]; vector<pair<ll,ll>> adj[MAXN]; pair<ll,ll> edge[MAXN]; ll dfs(ll st){ sz[st]=1; for(auto x:adj[st]){ if(de[x.fi]) continue; de[x.fi]=de[st]+1; dtr[x.fi]=dtr[st]+x.se; par[x.fi]=st; dist[st]=min(dist[st],dfs(x.fi)+x.se); sz[st]+=sz[x.fi]; } if(shop[st]&1) dist[st]=0; return dist[st]; } void HLD(ll u){ if(!headchain[cntchain]) headchain[cntchain]=u; chain[u]=cntchain; ll v=-1; for(auto x:adj[u]) if(!chain[x.fi]&&(u==-1||sz[x.fi]>sz[v])) v=x.fi; if(v>0) HLD(v); for(auto x:adj[u]){ if(!chain[x.fi]){ cntchain++; HLD(x.fi); } } en[u]=cntchain; } ll lca(ll u,ll v){ while(chain[u]!=chain[v]){ if(chain[u]>chain[v]) u=par[headchain[chain[u]]]; else v=par[headchain[chain[v]]]; } return (de[u]<de[v]?u:v); } ll tinh(ll u,ll v){ return de[u]+de[v]-2*de[lca(u,v)]; } void check(ll u,ll st){ ll stchain=chain[u],enchain=min(en[u],chain[st]); for(ll i=stchain;i<=enchain;i++){ if(de[par[headchain[i]]]<de[u]) continue; ans=min(ans,dist[par[headchain[i]]]-dtr[par[headchain[i]]]+dtr[st]); } } int main(){ ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin>>n>>S>>Q>>root; for(i=1;i<n;i++){ ll u,v,c; cin>>u>>v>>c; edge[i]={u,v}; adj[u].pb({v,c}); adj[v].pb({u,c}); } for(i=1;i<=S;i++) cin>>k,shop[k]=1; de[root]=1; fill(dist+1,dist+n+1,INF); dfs(root); HLD(root); for(i=1;i<=Q;i++){ ll block,E; cin>>block>>E; ll u=edge[block].fi,v=edge[block].se; if(de[u]<de[v]) swap(u,v); if(tinh(u,E)+tinh(v,root)+1==tinh(E,root)){ ans=min(dist[E],dist[u]-dtr[u]+dtr[E]); check(u,E); 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...