Submission #1275413

#TimeUsernameProblemLanguageResultExecution timeMemory
1275413SoMotThanhXuanValley (BOI19_valley)C++17
100 / 100
110 ms37020 KiB
#include <bits/stdc++.h> using namespace std; #define FOR(i, a, b) for(int i = (a), _b = (b); i <= _b; ++i) #define REP(i, a, b) for(int i = (a), _b = (b); i >= _b; --i) #define all(v) v.begin(), v.end() #define uni(v) v.erase(all(v), v.end()) #define mp make_pair #define Mask(i) (1 << (i)) #define Bit(x, i) (((x) >> (i)) & 1) #define Cnt(x) __builtin_popcount(x) #define Cntll(x) __builtin_popcountll(x) #define Ctz(x) __builtin_ctz(x) #define Ctzll(x) __builtin_ctzll(x) #define Clz(x) __builtin_clz(x) #define Clzll(x) __builtin_clzll(x) bool minimize(int &u, int v){ return u > v ? u = v, true : false;} bool maximize(int &u, int v){ return u < v ? u = v, true : false;} bool minimizell(long long &u, long long v){ return u > v ? u = v, true : false;} bool maximizell(long long &u, long long v){ return u < v ? u = v, true : false;} const int mod = 1e9 + 7; void add(int &u, int v){ u += v; if(u >= mod) u -= mod;} void sub(int &u, int v){ u -= v; if(u < 0) u += mod;} int fastPow(int a, int n){ if(n == 0) return 1; int t = fastPow(a, n >> 1); t = 1ll * t * t % mod; if(n & 1) t = 1ll * t * a % mod; return t; } const int maxN = 1e5 + 5; const int logN = __lg(maxN); const int maxM = 1e5 + 5; const int maxK = 1e5 + 5; const long long infll = 1e18; int n, s, e, q; int w[maxN]; pair<int, int> edge[maxN]; vector<int> adj[maxN]; bool spec[maxN]; int par[maxN][17]; long long d[maxN], f[maxN], dp[maxN], Min[maxN][17]; int in[maxN], out[maxN], timeDfs; int h[maxN]; void dfs(int u = 1, int p = 0){ in[u] = ++timeDfs; dp[u] = infll; if(spec[u]) dp[u] = d[u]; for(int id : adj[u]){ int v = edge[id].first ^ edge[id].second ^ u; if(v == p) continue; h[v] = h[u] + 1; d[v] = d[u] + w[id]; par[v][0] = u; dfs(v, u); minimizell(dp[u], dp[v]); } out[u] = timeDfs; if(dp[u] == infll)f[u] = infll; else f[u] = dp[u] - 2 * d[u]; } bool inside(int root, int u){ return in[root] <= in[u] && out[root] >= out[u]; } long long jump(int u, int target){ int dist = h[u] - h[target]; long long cur = d[u]; long long res = cur + f[u]; REP(i, 16, 0){ if(Bit(dist, i)){ minimizell(res, cur + Min[u][i]); u = par[u][i]; } } assert(u == target); return res; } void process(){ cin >> n >> s >> q >> e; FOR(i, 1, n - 1){ cin >> edge[i].first >> edge[i].second >> w[i]; adj[edge[i].first].emplace_back(i); adj[edge[i].second].emplace_back(i); } FOR(i, 1, s){ int u; cin >> u; spec[u] = true; } dfs(e, 0); FOR(i, 1, n - 1){ int u = edge[i].first, v = edge[i].second; if(in[u] > in[v]){ swap(u, v); swap(edge[i].first, edge[i].second); } Min[v][0] = f[u]; } d[0] = -1; FOR(j, 1, 16){ FOR(i, 1, n){ par[i][j] = par[par[i][j - 1]][j - 1]; Min[i][j] = min(Min[i][j - 1], Min[par[i][j - 1]][j - 1]); } } const long long Max = 1e17; while(q--){ int x, r; cin >> x >> r; int u = edge[x].first, v = edge[x].second; if(!inside(v, r)){ cout << "escaped\n"; continue; } long long answer = jump(r, v); if(answer >= Max)cout << "oo\n"; else cout << answer << '\n'; } } #define LOVE "valley" int main(){ ios_base :: sync_with_stdio(false); cin.tie(0); cout.tie(0); process(); 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...