Submission #1006064

#TimeUsernameProblemLanguageResultExecution timeMemory
1006064pudelosValley (BOI19_valley)C++17
36 / 100
3048 ms20940 KiB
#include <bits/stdc++.h> using namespace std; #define FOR(i, a, b) for(int i=a; i<=b; ++i) #define pi pair<int, int> #define f first #define s second #define sz(A) (int)(A.size()) #define ll long long #define pb push_back #define eb emplace_back #define V vector const int base=(1<<17); const ll inf=1e16; int n, s, q, e; struct Edge { int v, u, c, idx; }; struct SegmentTree { ll T[2*base]; void update(int a, int b, ll x) { if(a>b) return; FOR(i, a, b) T[i]+=x; } ll query(int a, int b) { if(a>b) return inf; ll res=inf; FOR(i, a, b) res=min(res, T[i]); return res; } } AT; V<V<Edge>> con; V<int> pre, post, sajs; V<V<pi>> todo; V<ll> odl, odp; V<Edge> edges; V<bool> jest_sklepem; int tpre=0, tpost=0; void dfs1(int v, int p=0, ll d=0) { pre[v]=++tpre; sajs[v]=1; if(jest_sklepem[v]) AT.update(pre[v], pre[v], d); for(Edge kr : con[v]) { int u = kr.u; int c = kr.c; if(p==u) continue; dfs1(u, v, d+c); sajs[v]+=sajs[u]; } post[v]=++tpost; } bool jest_ojcem(int a, int b) { return (pre[a]<=pre[b] && post[a]>=post[b]); } void dfs2(int v, int p=0) { for(auto &[idxkr, qidx] : todo[v]) { int a = edges[idxkr].v; int b = edges[idxkr].u; if(!jest_ojcem(a, b)) swap(a, b); int start = pre[b]; int kon = pre[b]+sajs[b]-1; if(start<=pre[v] && pre[v]<=kon) { // zawiera sie w poddrzewie odp[qidx] = AT.query(start, kon); } else { odp[qidx] = min(AT.query(1, start-1), AT.query(kon+1, n)); } } for(Edge kr : con[v]) { int u = kr.u; int c = kr.c; int idx = kr.idx; if(p==u) continue; // aktualizuj int start = pre[u]; int kon = pre[u]+sajs[u]-1; AT.update(start, kon, -c); AT.update(1, start-1, c); AT.update(kon+1, n, c); dfs2(u, v); // cofnij aktualizacje AT.update(start, kon, c); AT.update(1, start-1, -c); AT.update(kon+1, n, -c); } } int main() { cin.tie(0) -> ios_base::sync_with_stdio(0); cin >> n >> s >> q >> e; con.resize(n+1); todo.resize(n+1); pre.resize(n+1); post.resize(n+1); odl.resize(n+1); edges.resize(n); odp.resize(q+1); jest_sklepem.resize(n+1); sajs.resize(n+1); int a, b, c; FOR(i, 1, n-1) { cin >> a >> b >> c; con[a].pb({a, b, c, i}); con[b].pb({b, a, c, i}); edges[i] = {a, b, c, i}; } V<int> sklepy; AT.update(1, n, inf); FOR(i, 1, s) { cin>>a; if(jest_sklepem[a]) continue; jest_sklepem[a]=1; sklepy.eb(a); } // licz pre, post, AT.T(odl), sajs dfs1(e); for(int a : sklepy) { AT.update(pre[a], pre[a], -inf); } int id, v; FOR(i, 1, q) { cin >> id >> v; Edge kr = edges[id]; int a = kr.v; int b = kr.u; // a wyzej if(!jest_ojcem(a, b)) swap(a, b); if(!(jest_ojcem(e, a) && jest_ojcem(b, v))) odp[i]=-1; else todo[v].pb({id, i}); } dfs2(e); FOR(i, 1, q) { ll val = odp[i]; if(val==-1) cout << "escaped\n"; else if(val>=1e14) cout << "oo\n"; else cout << val << '\n'; } }

Compilation message (stderr)

valley.cpp: In function 'void dfs2(int, int)':
valley.cpp:74:9: warning: unused variable 'idx' [-Wunused-variable]
   74 |     int idx = kr.idx;
      |         ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...