제출 #1252272

#제출 시각아이디문제언어결과실행 시간메모리
1252272knhatdevValley (BOI19_valley)C++20
100 / 100
138 ms59192 KiB
#include<bits/stdc++.h> #define int long long #define ii pair<int,int> #define fi first #define se second using namespace std; const int N = 1e5 + 5, oo = 1e18; int n, s, q, e, f[N], dist[N]; int up[N][25], mi[N][25], h[N]; int tin[N], tout[N], timeDfs; vector<ii> g[N]; struct EDGE { int u, v, c; } edge[N]; void dfs(int u, int par) { tin[u] = ++timeDfs; for(auto &[v, c] : g[u]) { if(v == par) continue; dist[v] = dist[u] + c; up[v][0] = u; h[v] = h[u] + 1; dfs(v, u); if(f[v] != oo) f[u] = min(f[u], f[v] + c); } for(auto &[v, c] : g[u]) { mi[v][0] = min(mi[v][0], f[u] - dist[u]); } mi[u][0] = f[u] - dist[u]; tout[u] = timeDfs; } void init() { for(int j = 1; j <= 18; j++) { for(int i = 1; i <= n; i++) { up[i][j] = up[up[i][j - 1]][j - 1]; } } for(int j = 1; j <= 18; j++) { for(int i = 1; i <= n; i++) { mi[i][j] = min(mi[i][j - 1], mi[up[i][j - 1]][j - 1]); } } } main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define task "main" if(fopen(task ".inp", "r")) { freopen(task ".inp", "r", stdin); freopen(task ".out", "w", stdout); } cin >> n >> s >> q >> e; for(int i = 1; i < n; i++) { int u, v, c; cin >> u >> v >> c; edge[i] = {u, v, c}; g[u].push_back({v, c}); g[v].push_back({u, c}); } for(int i = 1; i <= n; i++) f[i] = oo; for(int i = 1; i <= s; i++) { int u; cin >> u; f[u] = 0; } for(int j = 0; j <= 18; j++) up[e][j] = e; memset(mi, 0x3f, sizeof mi); h[e] = 1; dfs(e, -1); init(); // cout << f[12] << ' ' << dist[12] << '\n'; while(q--) { int i, r; cin >> i >> r; int u = edge[i].u; int v = edge[i].v; if(h[v] > h[u]) swap(u, v); if(tin[u] <= tin[r] && tout[u] >= tin[r]) { int tmp_r = r; int ans = oo; ans = min(ans, f[r]); for(int j = 18; j >= 0; j--) { if(h[up[tmp_r][j]] > h[u]) { // cout << tmp_r << ' ' << j << ' ' << mi[tmp_r][j] << '\n'; ans = min(ans, dist[r] + mi[tmp_r][j]); tmp_r = up[tmp_r][j]; // cout << tmp_r << ' '; } } // int tmp_r = r; // for (int j = 18; j >= 0; j--) { // if (h[tmp_r] - (1LL << j) >= h[u]) { // ans = min(ans, dist[r] + mi[tmp_r][j]); // tmp_r = up[tmp_r][j]; // } // } if(h[tmp_r] > h[u]) { tmp_r = up[tmp_r][0]; ans = min(ans, dist[r] - dist[tmp_r] + f[tmp_r]); } if(ans == oo) cout << "oo" << '\n'; else cout << ans << '\n'; } else { cout << "escaped\n"; } } }

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

valley.cpp:57:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   57 | main()
      | ^~~~
valley.cpp: In function 'int main()':
valley.cpp:64:20: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   64 |             freopen(task ".inp", "r", stdin);
      |             ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
valley.cpp:65:20: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   65 |             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...