Submission #1149399

#TimeUsernameProblemLanguageResultExecution timeMemory
1149399dostsValley (BOI19_valley)C++17
100 / 100
157 ms64800 KiB
#include <bits/stdc++.h> #pragma GCC target("avx2") #pragma GCC optimize("O3,unroll-loops") using namespace std; #define int long long #define pii pair<int,int> #define ff first #define ss second #define sp << " " << #define all(cont) cont.begin(),cont.end() #define vi vector<int> const int inf = 1e18,N = 3e5+1,MOD = 998244353,BL = 1000; vector<pii> edges[N]; vi d(N),tin(N),tout(N),shop(N,0),f(N); int timer = 1; int up[N][20]; int opt[N][20]; void dfs(int node,int p) { up[node][0] = p; for (int i=1;i<20;i++) up[node][i] = up[up[node][i-1]][i-1]; tin[node] = timer++; if (node == p) d[node] = 0; for (auto it : edges[node]) { if (it.ff == p) continue; d[it.ff] = d[node]+it.ss; dfs(it.ff,node); } tout[node] = timer-1; if (!shop[node]) { shop[node] = inf; for (auto it : edges[node]) { if (it.ff == p) continue; shop[node] = min(shop[node],shop[it.ff]); } } else shop[node] = d[node]; f[node] = shop[node]-2*d[node]; } bool anc(int a,int b) { return tin[a] <= tin[b] && tout[a] >= tout[b]; } void solve() { int n,s,q,e; cin >> n >> s >> q >> e; vector<pii> edg(n); for (int i=1;i<n;i++) { int a,b,c; cin >> a >> b >> c; edg[i] = {a,b}; edges[a].push_back({b,c}); edges[b].push_back({a,c}); } for (int i=1;i<=s;i++) { int p; cin >> p; shop[p] = 1; } dfs(e,e); for (int i=1;i<=n;i++) opt[i][0] = f[i]; for (int j = 1;j<20;j++) { for (int i=1;i<=n;i++) { opt[i][j] = min(opt[i][j-1],opt[up[i][j-1]][j-1]); } } while (q--) { int block,node; cin >> block >> node; int v = node; if (anc(edg[block].ff,edg[block].ss)) swap(edg[block].ff,edg[block].ss); if (!anc(edg[block].ff,node)) { cout << "escaped\n"; continue; } int ans = f[node]; for (int i = 19;i>=0;i--) { if (!anc(up[node][i],edg[block].ss)) { ans = min(ans,opt[node][i]); node = up[node][i]; } } ans = min(ans,opt[node][0]); if (ans >= 1e17) cout << "oo\n"; else cout << d[v]+ans << '\n'; } } int32_t main() { ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); #ifdef Dodi freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif int t = 1; //cin >> t; while (t --> 0) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...