Submission #1001329

#TimeUsernameProblemLanguageResultExecution timeMemory
1001329ksu2009enValley (BOI19_valley)C++17
100 / 100
411 ms48256 KiB
#include <iostream> #include <vector> #include <string> #include <math.h> #include <cmath> #include <iomanip> #include <cstdio> #include <algorithm> #include <numeric> #include <map> #include <set> #include <queue> #include <stack> #include <deque> #include <bitset> #include <cstring> #include <unordered_map> using namespace std; typedef long long ll; ll dep[100007]; vector<pair<ll, ll>> d[100007]; ll t[400007], mod[400007], buildby[400007]; bool shop[100007]; ll n, s, q, e; void build(ll v, ll l, ll r){ if(l == r){ t[v] = buildby[l]; return; } ll mid = (l + r) >> 1; build(2 * v, l, mid); build(2 * v + 1, mid + 1, r); t[v] = min(t[2 * v], t[2 * v + 1]); } void push(ll v, ll l, ll r){ if(mod[v] != 0 && l != r){ t[2 * v] += mod[v]; t[2 * v + 1] += mod[v]; mod[2 * v] += mod[v]; mod[2 * v + 1] += mod[v]; mod[v] = 0; } } ll get(ll v, ll l, ll r, ll ql, ll qr){ if(r < ql || qr < l) return (ll)(1e16); if(ql <= l && r <= qr) return t[v]; ll mid = (l + r) >> 1; push(v, l, r); return min(get(2 * v, l, mid, ql, qr), get(2 * v + 1, mid + 1, r, ql, qr)); } ll get1(ll v, ll l, ll r, ll pos){ if(l == r) return t[v]; ll mid = (l + r) >> 1; push(v, l, r); if(pos <= mid) return get1(2 * v, l, mid, pos); return get1(2 * v + 1, mid + 1, r, pos); } void update(ll v, ll l, ll r, ll ql, ll qr, ll val){ if(r < ql || qr < l) return; if(ql <= l && r <= qr){ t[v] += val; mod[v] += val; return; } ll mid = (l + r) >> 1; push(v, l, r); update(2 * v, l, mid, ql, qr, val); update(2 * v + 1, mid + 1, r, ql, qr, val); t[v] = min(t[2 * v], t[2 * v + 1]); } ll time_in[100007], time_out[100007]; ll step = 0; void dfs(ll v, ll par){ time_in[v] = ++step; for(auto i: d[v]){ if(i.first != par){ dep[i.first] = dep[v] + i.second; dfs(i.first, v); } } time_out[v] = step; } bool ispar(ll a, ll b){ return time_in[a] <= time_in[b] && time_in[b] <= time_out[a]; } vector<pair<ll, ll>> quer[100007]; vector<pair<ll, ll>> edges; string ans[100007]; void dfs2(ll v, ll par){ for(auto p: quer[v]){ pair<ll, ll> i = edges[p.first - 1]; if(ispar(i.second, v)){ update(1, 1, n, 1, n, (ll)(1e16)); update(1, 1, n, time_in[i.second], time_out[i.second], -(ll)(1e16)); } else{ update(1, 1, n, time_in[i.second], time_out[i.second], (ll)(1e16)); } // for(int j = 1; j <= n; j++) // cout << get1(1, 1, n, time_in[j]) << ' '; // cout << endl; ll val = get1(1, 1, n, time_in[e]); if(val < (ll)(1e16)){ ans[p.second] = "escaped"; } else{ ll h = get(1, 1, n, 1, n); if(h < (ll)(1e16)) ans[p.second] = to_string(h); else ans[p.second] = "oo"; } if(ispar(i.second, v)){ update(1, 1, n, 1, n, -(ll)(1e16)); update(1, 1, n, time_in[i.second], time_out[i.second], (ll)(1e16)); } else{ update(1, 1, n, time_in[i.second], time_out[i.second], -(ll)(1e16)); } } for(auto i: d[v]){ if(i.first != par){ update(1, 1, n, 1, n, i.second); update(1, 1, n, time_in[i.first], time_out[i.first], -2 * i.second); dfs2(i.first, v); update(1, 1, n, 1, n, -i.second); update(1, 1, n, time_in[i.first], time_out[i.first], 2 * i.second); } } } int main(){ cin >> n >> s >> q >> e; for(int i = 0; i < n - 1; i++){ ll a, b, c; cin >> a >> b >> c; edges.push_back({a, b}); d[a].push_back({b, c}); d[b].push_back({a, c}); } for(int i = 0; i < s; i++){ ll c; cin >> c; shop[c] = true; } dfs(1, -1); // fill in buildby for(int i = 1; i <= n; i++){ if(!shop[i] && i != e){ buildby[time_in[i]] = dep[i] + (ll)(1e16); continue; } buildby[time_in[i]] = dep[i]; } build(1, 1, n); for(auto &i: edges){ if(dep[i.first] > dep[i.second]) swap(i.first, i.second); } for(int i = 0; i < q; i++){ ll e, v; cin >> e >> v; quer[v].push_back({e, i}); } dfs2(1, -1); for(int i = 0; i < q; i++) cout << ans[i] << endl; 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...