제출 #1263650

#제출 시각아이디문제언어결과실행 시간메모리
1263650minggaValley (BOI19_valley)C++20
100 / 100
207 ms25244 KiB
// Author: caption_mingle #include "bits/stdc++.h" using namespace std; #define ln "\n" #define pb push_back #define fi first #define se second #define all(x) (x).begin(), (x).end() #define sz(x) ((int)(x).size()) #define ll long long const int mod = 1e9 + 7; const ll inf = 2e18; const int N = 1e5 + 7; int n, s, q, e; pair<int, int> edge[N]; int in[N], out[N], timer; bool mark[N]; ll ans[N], st[N * 4], lazy[N * 4], lev[N]; vector<pair<int, int>> g[N], ev[N]; void push(int i) { if(lazy[i]) { ll x = lazy[i]; lazy[i] = 0; st[i * 2] += x; st[i * 2 + 1] += x; lazy[i * 2] += x; lazy[i * 2 + 1] += x; } } void update(int i, int l, int r, int u, int v, ll x) { if(l > v or r < u) return; if(u <= l and r <= v) { st[i] += x; lazy[i] += x; return; } push(i); int m = (l + r) >> 1; update(i * 2, l, m, u, v, x); update(i * 2 + 1, m + 1, r, u, v, x); st[i] = min(st[i * 2], st[i * 2 + 1]); } ll get(int i, int l, int r, int u, int v) { if(l > v or r < u) return inf; if(u <= l and r <= v) return st[i]; push(i); int m = (l + r) >> 1; return min(get(i * 2, l, m, u, v), get(i * 2 + 1, m + 1, r, u, v)); } void pre_dfs(int u, int p) { in[u] = ++timer; for(auto [v, w] : g[u]) { if(v == p) continue; lev[v] = lev[u] + w; pre_dfs(v, u); } out[u] = timer; } bool inside(int u, int v) { return in[u] <= in[v] and out[v] <= out[u]; } void dfs(int u, int p) { for(auto [eid, id] : ev[u]) { auto [par, v] = edge[eid]; if(inside(v, u)) { ans[id] = get(1, 1, n, in[v], out[v]); } else { ans[id] = min(get(1, 1, n, 1, in[v] - 1), get(1, 1, n, out[v] + 1, n)); } } for(auto [v, w] : g[u]) { if(v == p) continue; update(1, 1, n, in[v], out[v], -w); update(1, 1, n, 1, in[v] - 1, w); update(1, 1, n, out[v] + 1, n, w); dfs(v, u); update(1, 1, n, in[v], out[v], w); update(1, 1, n, 1, in[v] - 1, -w); update(1, 1, n, out[v] + 1, n, -w); } } signed main() { cin.tie(0) -> sync_with_stdio(0); #define task "" 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, w; cin >> u >> v >> w; g[u].pb({v, w}); g[v].pb({u, w}); edge[i] = {u, v}; } pre_dfs(1, 0); for(int i = 1; i < n; i++) { auto& [u, v] = edge[i]; if(in[u] > in[v]) swap(u, v); } for(int i = 1; i <= s; i++) { int x; cin >> x; mark[x] = 1; } for(int i = 1; i <= q; i++) { int id, x; cin >> id >> x; auto [u, v] = edge[id]; if(inside(v, e) and inside(v, x)) { ans[i] = -1; } else if(!inside(v, e) and !inside(v, x)) { ans[i] = -1; } else { ev[x].pb({id, i}); } } for(int i = 1; i <= n; i++) { ll val = inf; if(mark[i]) val = lev[i]; update(1, 1, n, in[i], in[i], val); } dfs(1, 0); for(int i = 1; i <= q; i++) { if(ans[i] == -1) cout << "escaped"; else if(ans[i] > 1e15) cout << "oo"; else cout << ans[i]; cout << ln; } cerr << "\nTime: " << clock() * 1000 / CLOCKS_PER_SEC; }

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

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