Submission #1133003

#TimeUsernameProblemLanguageResultExecution timeMemory
1133003aaa2312Valley (BOI19_valley)C++20
100 / 100
301 ms71396 KiB
#pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #include <bits/stdc++.h> using namespace std; using ll = long long; const ll mod = 1e9 + 7; const ll mod2 = 998244353; const ll max_dist=1e16; ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; } ll pow(ll a, ll b) { ll ans = 1; while (b) { if (b & 1) ans *= a; b >>= 1; a *= a; } return ans; } ll pow(ll a, ll b, ll c) { ll ans = 1; while (b) { if (b & 1) ans = (ans * a) % c; b >>= 1; a = (a * a) % c; } return ans; } void check(bool b) { if (b) cout << "Yes\n"; else cout << "No\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); ll n,s,q,e; cin>>n>>s>>q>>e; vector<vector<pair<ll,ll>>> adj(n+1); vector<pair<ll,ll>>edges; for (int i = 0; i < n - 1; ++i) { ll u,v,w; cin>>u>>v>>w; edges.push_back({u,v}); adj[u].push_back({v,w}); adj[v].push_back({u,w}); } vector<ll>par(n+1),dp(n+1,max_dist),par_dist(n+1),tin(n+1),tout(n+1); for (int i = 0; i < s; ++i) { ll x; cin>>x; dp[x]=0; } ll timer=0; function<void(ll,ll)>dfs=[&](ll u,ll p){ tin[u]=++timer; par[u]=p; for(auto [v,w]:adj[u]){ if(v==p)continue; par_dist[v]=w; dfs(v,u); dp[u]=min(dp[u],dp[v]+w); } tout[u]=++timer; }; dfs(e,e); ll l=log2(n)+1; vector<vector<ll>>anc(n+1,vector<ll>(l)),min_anc(n+1,vector<ll>(l)),dist(n+1,vector<ll>(l)); for (int i = 1; i <= n; ++i) { anc[i][0]=par[i]; dist[i][0]=par_dist[i]; min_anc[i][0]=min(par_dist[i]+dp[par[i]],dp[i]); } for (int j = 1; j < l; ++j) { for (int i = 1; i <= n; ++i) { anc[i][j]=anc[anc[i][j-1]][j-1]; dist[i][j]=dist[i][j-1]+dist[anc[i][j-1]][j-1]; min_anc[i][j]=min(min_anc[i][j-1],min_anc[anc[i][j-1]][j-1]+dist[i][j-1]); } } function<bool(ll,ll)>is_ancestor=[&](ll u,ll v){ return tin[u]<=tin[v]&&tout[u]>=tout[v]; }; function<bool(ll,ll)>is_hard_ancestor=[&](ll u,ll v){ return tin[u]<tin[v]&&tout[u]>tout[v]; }; while (q--){ ll x,v; cin>>x>>v;--x; x=(is_ancestor(edges[x].first,edges[x].second)?edges[x].second:edges[x].first); if (!is_ancestor(x,v)){ cout<<"escaped\n"; continue; } ll ans=dp[v],z=0; for (int i = l-1; i >=0 ; --i) { if (!is_hard_ancestor(anc[v][i],x)){ ans= min(ans,min_anc[v][i]+z); z+=dist[v][i]; v=anc[v][i]; } } if (ans==max_dist){ cout<<"oo\n"; } else cout<<ans<<'\n'; } 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...