제출 #1175474

#제출 시각아이디문제언어결과실행 시간메모리
1175474CrabCNHValley (BOI19_valley)C++20
100 / 100
130 ms53756 KiB
#include <bits/stdc++.h> #define task "BriantheCrab" #define int long long #define pii pair <int, int> #define fi first #define se second #define szf sizeof #define sz(s) (int)((s).size()) using namespace std; template <class T> void mini (T &t, T f) {if (t > f) t = f;} template <class T> void maxi (T &t, T f) {if (t < f) t = f;} const int maxN = 1e5 + 5; const int inf = 1e18 + 7; const int mod = 1e9 + 7; const int LOG = 21; struct Ed { int u, v, w; }; int n, s, q, e; int timer = 0; Ed edge[maxN]; int par[maxN], sz[maxN], head[maxN], in[maxN]; int d[maxN], h[maxN]; bool spe[maxN]; int dp[maxN], st[maxN][LOG], up[maxN][LOG]; vector <pii> adj[maxN]; void dfs (int u, int p) { sz[u] = 1; in[u] = ++ timer; for (auto [v, _] : adj[u]) { if (v != p) { par[v] = u; dfs (v, u); sz[u] += sz[v]; } } } void HLD (int u, int p, int h) { head[u] = h; if (adj[u].size () == 1 && u != e) { return; } int nxt = 0, curmax = 0; for (auto [v, _] : adj[u]) { if (v == p) { continue; } if (sz[v] > curmax) { curmax = sz[v]; nxt = v; } } HLD (nxt, u, h); for (auto [v, _] : adj[u]) { if (v != nxt && v != p) { HLD (v, u, v); } } } int LCA (int u, int v) { while (head[u] != head[v]) { if (sz[head[u]] < sz[head[v]]) { u = par[head[u]]; } else { v = par[head[v]]; } } return ((sz[u] > sz[v]) ? u : v); } void cal (int u, int p) { dp[u] = inf; //cout << u << '\n'; if (spe[u]) { //cout << "hi\n"; dp[u] = d[u]; } for (auto [v, w] : adj[u]) { if (v == p) { continue; } h[v] = h[u] + 1; d[v] = d[u] + w; //cout << v << ' ' <<u << '\n'; cal (v, u); mini (dp[u], dp[v]); } } void solve () { cin >> n >> s >> q >> e; for (int i = 1; i < n; i ++) { int u, v, w; cin >> u >> v >> w; adj[u].push_back ({v, w}); adj[v].push_back ({u, w}); edge[i] = {u, v, w}; } for (int i = 1; i <= s; i ++) { int x; cin >> x; spe[x] = 1; } dfs (e, e); HLD (e, e, e); cal (e, e); //cout << LCA (5, 1) << '\n'; for (int i = 1; i <= n; i ++) { if (dp[i] != inf) { dp[i] -= 2 * d[i]; } } for (int i = 1; i <= n; i ++) { st[i][0] = dp[par[i]]; up[i][0] = par[i]; } for (int j = 1; j < LOG; j ++) { for (int i = 1; i <= n; i ++) { up[i][j] = up[up[i][j - 1]][j - 1]; st[i][j] = min (st[i][j - 1], st[up[i][j - 1]][j - 1]); } } // for (int i = 1; i <= n; i ++) { // cout << d[i] << '\n'; // } while (q --) { int I, R; cin >> I >> R; auto [u, v, w] = edge[I]; if (in[u] < in[v]) { swap (u, v); } v = R; //cout << u << ' ' << v << ' ' << LCA (u, v) << '\n'; if (LCA (u, v) == u && h[u] <= h[v]) { if (spe[v] == true) { cout << "0\n"; } //cout << dp[u] << ' ' << dp[v] << '\n'; else if (dp[u] == inf) { cout << "oo\n"; } else { int cur = h[v] - h[u]; //cout << u << ' ' << v << ' ' << d[v] << '\n'; int bestL = dp[v]; int bestR = d[v]; for (int i = 0; i < LOG; i ++) { if ((cur >> i) & 1) { mini (bestL, st[v][i]); v = up[v][i]; //cout << v << ' ' << dp[v] << '\n'; } } if (bestL + bestR < 0) { cout << "oo\n"; continue; } cout << bestL + bestR << '\n'; } } else { cout << "escaped\n"; } } } signed main () { cin.tie (nullptr) -> sync_with_stdio (false); if (fopen (task".inp", "r")) { freopen (task".inp", "r", stdin); freopen (task".out", "w", stdout); } int t = 1; //cin >> t; while (t --) { solve (); } return 0; } // thfdgb

컴파일 시 표준 에러 (stderr) 메시지

valley.cpp: In function 'int main()':
valley.cpp:182:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  182 |         freopen (task".inp", "r", stdin);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
valley.cpp:183:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  183 |         freopen (task".out", "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...