Submission #1104650

#TimeUsernameProblemLanguageResultExecution timeMemory
1104650tuannmValley (BOI19_valley)C++17
100 / 100
120 ms35144 KiB
#include<bits/stdc++.h> #define ii pair<int, int> #define ll pair<long long, long long> #define fi first #define se second #define pb push_back #define eb emplace_back using namespace std; const int mod[2] = {1000000007, 998244353}; const int N = 1e5 + 1; const long long inf = 1e16; const string NAME = "landslide"; int n, s, q, h; int pos[N]; vector<ii> adj[N]; struct edge{ int u, v, w; edge(int _u = 0, int _v = 0, int _w = 0) : u(_u), v(_v), w(_w) {} }; edge ed[N]; long long nearest[N], dist[N], jump[20][N]; int d[N], lg[N], in[N], out[N], cnt; int p[20][N]; void DFS(int u){ in[u] = ++cnt; for(auto [v, w] : adj[u]){ if(v == p[0][u]) continue; p[0][v] = u; d[v] = d[u] + 1; dist[v] = dist[u] + w; for(int i = 1; i <= lg[d[v]]; ++i) p[i][v] = p[i - 1][p[i - 1][v]]; DFS(v); } out[u] = cnt; } void DFS_nearest(int u){ for(auto [v, w] : adj[u]){ if(v == p[0][u]) continue; DFS_nearest(v); nearest[u] = min(nearest[u], nearest[v]); } } bool isAncestor(int u, int v){ return in[u] <= in[v] && in[v] <= out[u]; } long long minPath(int u, int v){ long long res = inf; int k = d[v] - d[u]; for(int i = lg[k]; i >= 0; --i) if((k >> i) & 1) res = min(res, jump[i][v]), v = p[i][v]; return min(res, nearest[u]); } void inp(){ cin >> n >> s >> q >> h; for(int i = 1; i < n; ++i){ int u, v, w; cin >> u >> v >> w; ed[i] = edge(u, v, w); adj[u].eb(v, w); adj[v].eb(u, w); } for(int i = 1; i <= s; ++i) cin >> pos[i]; } void init(){ for(int i = 2; i <= n; ++i) lg[i] = lg[i / 2] + 1; for(int i = 1; i <= n; ++i) nearest[i] = inf; DFS(h); for(int i = 1; i <= s; ++i) nearest[pos[i]] = dist[pos[i]]; DFS_nearest(h); for(int i = 1; i <= n; ++i){ if(nearest[i] < inf) nearest[i] -= 2LL * dist[i]; jump[0][i] = nearest[i]; } for(int l = 1; l <= lg[n]; ++l) for(int i = 1; i <= n; ++i) jump[l][i] = min(jump[l - 1][i], jump[l - 1][p[l - 1][i]]); for(int i = 1; i < n; ++i){ auto [u, v, w] = ed[i]; if(in[u] > in[v]) swap(u, v); ed[i] = edge(u, v, w); } } void solve(){ init(); while(q--){ int id, u; cin >> id >> u; int v = ed[id].v; if(!isAncestor(v, u)) cout << "escaped\n"; else{ long long res = minPath(v, u) + dist[u]; if(res >= inf) cout << "oo\n"; else cout << res << "\n"; } } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); if(fopen((NAME + ".inp").c_str(), "r")){ freopen((NAME + ".inp").c_str(), "r", stdin); freopen((NAME + ".out").c_str(), "w", stdout); } inp(); solve(); }

Compilation message (stderr)

valley.cpp: In function 'int main()':
valley.cpp:152:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  152 |         freopen((NAME + ".inp").c_str(), "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
valley.cpp:153:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  153 |         freopen((NAME + ".out").c_str(), "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...