제출 #677868

#제출 시각아이디문제언어결과실행 시간메모리
677868TS_2392Valley (BOI19_valley)C++14
100 / 100
243 ms62840 KiB
#include <bits/stdc++.h> #define fileIO(name) if(fopen(name".inp", "r")) {freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout);} #define SPEED ios_base :: sync_with_stdio(0); cin.tie(0); cout.tie(0) #define dbgp(x) cout << #x << " = (" << (x.fi) << ", " << (x.se) << ") " #define dbg(x) cout << #x << " = " << (x) << ' ' #define rall(x) (x).rbegin(), (x).rend() #define all(x) (x).begin(), (x).end() #define sqr(x) (x) * (x) #define pct __builtin_popcountll #define lwb lower_bound #define upb upper_bound #define eb emplace_back #define epl emplace #define mp make_pair #define fi first #define se second using namespace std; typedef long long ll; typedef long double ldb; typedef unsigned int uint; typedef unsigned long long ull; typedef pair<ll, ll> pll; typedef pair<ll, int> pli; typedef pair<int, ll> pil; typedef pair<int, int> pii; typedef pair<ldb, ldb> pld; typedef pair<double, double> pdd; template<class T1, class T2> bool minimize(T1 &a, T2 b){ if(a > b){a = b; return true;} return false; } template<class T1, class T2> bool maximize(T1 &a, T2 &b){ if(a < b){a = b; return true;} return false; } const int N = 1e5 + 10; const ll oo = 1e16; int n, nDot, qsn, root, Tin[N], Tout[N], Timer, dep[N]; ll jmp[N][18], dpUp[N][18], sumUp[N][18], dp[N]; pii edge[N]; vector<pil> adj[N]; ll lift(int u, int len){ ll sum = 0, res = oo; for(int i = 0; i <= 17; ++i) if(len >> i & 1){ minimize(res, dpUp[u][i] + sum); sum += sumUp[u][i]; u = jmp[u][i]; } return res; } void dfs(int u, int par){ Tin[u] = ++Timer; for(int i = 0; i < adj[u].size(); ++i){ int v = adj[u][i].fi; ll w = adj[u][i].se; if(v == par) continue; jmp[v][0] = u; sumUp[v][0] = w; dep[v] = dep[u] + 1; dfs(v, u); minimize(dp[u], dp[v] + w); } for(int i = 0; i < adj[u].size(); ++i){ int v = adj[u][i].fi; ll w = adj[u][i].se; if(v == par) continue; dpUp[v][0] = min(oo, dp[u] + w); } Tout[u] = ++Timer; } bool IsAncestor(int u, int v){ return Tin[u] < Tin[v] && Tout[v] < Tout[u]; } int main(){ SPEED; cin >> n >> nDot >> qsn >> root; for(int i = 1; i < n; ++i){ int u, v, w; cin >> u >> v >> w; adj[u].eb(v, w); adj[v].eb(u, w); edge[i] = {u, v}; } for(int i = 1; i <= n; ++i) dp[i] = oo; for(int i = 1; i <= nDot; ++i){ int v; cin >> v; dp[v] = 0; } dfs(root, 0); for(int i = 1; i <= 17; ++i){ for(int u = 1; u <= n; ++u) if(jmp[u][i - 1] > 0){ jmp[u][i] = jmp[jmp[u][i - 1]][i - 1]; sumUp[u][i] = sumUp[u][i - 1] + sumUp[jmp[u][i - 1]][i - 1]; dpUp[u][i] = min(dpUp[u][i - 1], sumUp[u][i - 1] + dpUp[jmp[u][i - 1]][i - 1]); } } //dbg(root); cout << '\n'; while(qsn--){ int id, u, cur; cin >> id >> u; if(jmp[edge[id].fi][0] == edge[id].se) cur = edge[id].fi; else cur = edge[id].se; //dbg(cur); dbg(u); if(cur == u || IsAncestor(cur, u)){ int len = dep[u] - dep[cur]; ll res = min(dp[u], lift(u, len)); if(res >= oo) cout << "oo"; else cout << res; cout << '\n'; } else cout << "escaped\n"; } return 0; }

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

valley.cpp: In function 'void dfs(int, int)':
valley.cpp:60:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   60 |     for(int i = 0; i < adj[u].size(); ++i){
      |                    ~~^~~~~~~~~~~~~~~
valley.cpp:69:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |     for(int i = 0; i < adj[u].size(); ++i){
      |                    ~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...