Submission #497906

#TimeUsernameProblemLanguageResultExecution timeMemory
497906armashkaValley (BOI19_valley)C++17
100 / 100
372 ms91232 KiB
#include <bits/stdc++.h> //#pragma comment(linker, "/stack:200000000") //#pragma GCC optimize("Ofast") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") #define fast ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr); #define all(v) v.begin(),v.end() #define pb push_back #define sz size() #define ft first #define sd second using namespace std; typedef long long ll; typedef pair<ll, ll> pll; typedef unsigned long long ull; const int N = 1e6 + 5; const ll M = 1e8; const ll inf = 1e18; const ll mod = 1e9; const double Pi = acos(-1); ll binpow(ll x, ll ti) { ll res = 1;while (ti){if(ti & 1)res *= x;x *= x;ti >>= 1; x %= mod; res %= mod;} return res;} ll binmul(ll x, ll ti) { ll res = 0;while (ti){if(ti & 1)res += x;x += x;ti >>= 1; x %= mod; res %= mod;} return res;} ll nok(ll a, ll b) { return (a*b)/__gcd(abs(a),abs(b)) * (a*b > 0 ? 1 : -1); } bool odd(ll n) { return (n % 2 == 1); } bool even(ll n) { return (n % 2 == 0); } ll n, s, k, e, dp[N], in[N], out[N], timer, up[N][30], mnn[N][30], sel[N], h[N], d[N]; pll edge[N]; vector <pll> g[N]; void dfs(ll v, ll pr) { up[v][0] = pr; in[v] = ++ timer; ll mn = inf; for (auto [to, w] : g[v]) { if (to != pr) { h[to] = h[v] + 1; d[to] = d[v] + w; dfs(to, v); mn = min(mn, dp[to] + w); } } if (sel[v]) mn = 0; dp[v] = mn; for (auto [to, w] : g[v]) { if (to != pr) { mnn[to][0] = dp[v] - d[v]; } } out[v] = ++ timer; } ll get(ll u, ll v, ll pr) { if (in[v] >= in[pr] && out[v] <= out[pr]); else return inf; ll mn = dp[v] + (d[u] - d[v]); for (int i = 0; i <= 25; ++ i) { ll cur = up[v][i]; //cout << cur << " " << pr << "\n"; if (in[cur] >= in[pr] && out[cur] <= out[pr]) { mn = min(mn, mnn[v][i] + d[u]); } else { mn = min(mn, get(u, up[v][i - 1], pr)); break; } } return mn; } const void solve(/*Armashka*/) { cin >> n >> s >> k >> e; for (int i = 1; i < n; ++ i) { ll u, v, w; cin >> u >> v >> w; g[u].pb({v, w}); g[v].pb({u, w}); edge[i] = {u, v}; } for (int i = 1; i <= n; ++ i) dp[i] = inf; for (int i = 1; i <= s; ++ i) { ll x; cin >> x; sel[x] = 1; } dfs(e, -1); //for (int i = 1; i <= n; cout << dp[i] << " ", ++ i); for (int i = 1; i <= 25; ++ i) { for (int j = 1; j <= n; ++ j) { up[j][i] = up[up[j][i - 1]][i - 1]; mnn[j][i] = min(mnn[j][i - 1], mnn[up[j][i - 1]][i - 1]); } } for (int i = 1; i <= k; ++ i) { ll id, start; cin >> id >> start; ll a = edge[id].ft, b = edge[id].sd; if (h[a] < h[b]) swap(a, b); if (in[a] > in[start] || out[a] < out[start]) { cout << "escaped\n"; continue; } ll res = get(start, start, a); if (res == inf) cout << "oo\n"; else cout << res << "\n"; } } signed main() { fast; //freopen("divide.in", "r", stdin); //freopen("divide.out", "w", stdout); int tt = 1; //cin >> tt; while (tt --) { solve(); } } /* 5 4 4 1 2 3 1 3 4 5 3 4 5 2 3 2 1 3 1 1 3 5 2 3 4 5 2 1 3 1 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...