Submission #1095813

#TimeUsernameProblemLanguageResultExecution timeMemory
1095813natus26Valley (BOI19_valley)C++17
36 / 100
66 ms65104 KiB
#include <bits/stdc++.h> #define task "1" #define ll long long #define double long double #define ii pair<int, int> #define li pair<ll, int> #define fi first #define se second #define all(v) (v).begin(), (v).end() #define FULL(i) ((1LL << i) - 1) #define MASK(i) (1LL << i) #define c_bit(i) __builtin_popcountll(i) #define Bit(mask, i) ((mask >> i) & 1) #define onbit(mask, i) ((mask) bitor (1LL << i)) #define offbit(mask, i) ((mask) &~ (1LL << i)) using namespace std; const int maxn = 1e5 + 5; const ll oo = 1e16; const int mod = 1e9 + 7; const int dx[] = {0, 1, 0, -1} , dy[] = {1, 0, -1, 0}; template <class X, class Y> bool maximize(X &a, const Y &b) { if(a < b) return a = b, true; return false; } template <class X, class Y> bool minimize(X &a, const Y &b) { if(a > b) return a = b, true; return false; } int n, s, q, h, in[maxn], out[maxn], depth[maxn], pos[maxn]; ll res[maxn], t[maxn << 2]; bool shop[maxn]; vector<ii> adj[maxn]; vector<ii> queries[maxn]; ll d[maxn], lazy[maxn << 2]; ii rmq[maxn][20], edges[maxn]; void dfs(int u, int p) { static int timeDfs = 0, id = 0; in[u] = ++ timeDfs; rmq[++ id][0] = {depth[u], u}; pos[u] = id; for(auto [v, w] : adj[u]) if(v != p){ depth[v] = depth[u] + 1; d[v] = d[u] + w; dfs(v, u); rmq[++ id][0] = {depth[u], u}; } out[u] = timeDfs; } bool inSubTree(int v, int u) { return in[u] <= in[v] && in[v] <= out[u]; } ll dist(int u, int v) { int l = pos[u], r = pos[v]; if(l > r) swap(l, r); int h = __lg(r - l + 1); int lca = min(rmq[l][h], rmq[r - (1 << h) + 1][h]).se; return d[u] + d[v] - 2 * d[lca]; } void down(int id) { if(!lazy[id]) return; for(int i : {id << 1, id << 1 | 1}){ t[i] += lazy[id]; lazy[i] += lazy[id]; } lazy[id] = 0; } void update(int u, int v, ll val, int id = 1, int l = 1, int r = n) { if(r < u || l > v) return; if(u <= l && r <= v){ t[id] += val; lazy[id] += val; return; } down(id); int mid = l + r >> 1; update(u, v, val, id << 1, l, mid); update(u, v, val, id << 1 | 1, mid + 1, r); t[id] = min(t[id << 1], t[id << 1 | 1]); } ll get(int u, int v, int id = 1, int l = 1, int r = n) { if(r < u || l > v) return oo; if(u <= l && r <= v) return t[id]; down(id); int mid = l + r >> 1; return min(get(u, v, id << 1, l, mid), get(u, v, id << 1 | 1, mid + 1, r)); } void solve(int u, int p) { for(auto [e, i] : queries[u]){ auto [x, y] = edges[e]; if(depth[x] < depth[y]) swap(x, y); if(!inSubTree(u, x)) { res[i] = -1; continue; } res[i] = get(in[x], out[x]); } for(auto [v, w] : adj[u]) if(v != p){ update(in[v], out[v], -w); update(1, in[v] - 1, w); update(out[v] + 1, n, w); solve(v, u); update(in[v], out[v], w); update(1, in[v] - 1, -w); update(out[v] + 1, n, -w); } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); if(fopen(task".inp", "r")){ freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); } cin >> n >> s >> q >> h; for(int i = 1; i < n; ++ i){ int u, v, w; cin >> u >> v >> w; edges[i] = {u, v}; adj[u].push_back({v, w}); adj[v].push_back({u, w}); } dfs(h, 0); for(int k = 1; 1 << k <= n << 1; ++ k) for(int i = 1; i + (1 << k) - 1 <= n << 1; ++ i) rmq[i][k] = min(rmq[i][k - 1], rmq[i + (1 << k - 1)][k - 1]); for(int i = 1; i <= s; ++ i){ int u; cin >> u; shop[u] = true; update(in[u], in[u], dist(u, h)); } for(int u = 1; u <= n; ++ u) if(!shop[u]) update(in[u], in[u], oo); for(int i = 1; i <= q; ++ i){ int e, u; cin >> e >> u; queries[u].push_back({e, i}); } solve(h, 0); for(int i = 1; i <= q; ++ i){ if(!~res[i]) cout << "escaped\n"; else if(res[i] > 1e14) cout << "oo\n"; else cout << res[i] << '\n'; } return 0; }

Compilation message (stderr)

valley.cpp: In function 'void update(int, int, long long int, int, int, int)':
valley.cpp:82:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   82 |     int mid = l + r >> 1;
      |               ~~^~~
valley.cpp: In function 'long long int get(int, int, int, int, int)':
valley.cpp:93:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   93 |     int mid = l + r >> 1;
      |               ~~^~~
valley.cpp: In function 'int main()':
valley.cpp:134:56: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
  134 |         rmq[i][k] = min(rmq[i][k - 1], rmq[i + (1 << k - 1)][k - 1]);
      |                                                      ~~^~~
valley.cpp:120:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  120 |         freopen(task".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
valley.cpp:121:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  121 |         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...