Submission #1281803

#TimeUsernameProblemLanguageResultExecution timeMemory
1281803AbdullahIshfaqTwo Currencies (JOI23_currencies)C++20
10 / 100
189 ms53304 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define MOD 998244353 const int N = 100010, lg = 20; ll n, m, k, x[N], y[N], a[N], ccol[N], ts[4 * N], tc[4 * N], tl[4 * N], trt[4 * N], roots[N], cc = 0, p[N][lg], h[N]; vector<ll> g[N], g2[N]; vector<vector<ll>> col; int update(int u, int id, int l = 0, int r = m) { if (id < l || r <= id) return u; cc++; ll xx = cc; ts[xx] = ts[u]; tc[xx] = tc[u]; tl[xx] = tl[u]; trt[xx] = trt[u]; ts[xx] += col[id][0]; tc[xx] += 1; if (r - l == 1) return xx; ll m = (l + r) / 2; tl[xx] = update(tl[xx], id, l, m); trt[xx] = update(trt[xx], id, m, r); return xx; } int query(int r1, int r2, int r3, ll s, int l = 0, int r = m) { if (tc[r2] + tc[r3] - 2 * tc[r1] <= 1) { return (s < ts[r2] + ts[r3] - 2 * ts[r1]) ? 1 : 0; } ll m = (l + r) / 2; if (ts[tl[r2]] + ts[tl[r3]] - 2 * ts[tl[r1]] > s) { return query(tl[r1], tl[r2], tl[r3], s, l, m) + tc[trt[r2]] + tc[trt[r3]] - 2 * tc[trt[r1]]; } else { return query(trt[r1], trt[r2], trt[r3], s - (ts[tl[r2]] + ts[tl[r3]] - 2 * ts[tl[r1]]), m, r); } } void dfs(int u, int par) { p[u][0] = par; roots[u] = roots[par]; for (auto i : g2[u]) { if (x[a[i]] == par or y[a[i]] == par) { roots[u] = update(roots[u], ccol[i]); } } for (auto i : g[u]) { if (i != par) { h[i] = h[u] + 1; dfs(i, u); } } } int lca(int x1, int y1) { if (h[x1] > h[y1]) swap(x1, y1); ll d = h[y1] - h[x1]; for (int i = 0; i < lg; i++) { if ((1ll << i) & d) y1 = p[y1][i]; } if (x1 == y1) return x1; for (int i = lg - 1; i >= 0; i--) { if (p[x1][i] != p[y1][i]) { x1 = p[x1][i]; y1 = p[y1][i]; } } return p[x1][0]; } void solve() { cin >> n >> m >> k; for (int i = 1; i < n; i++) { cin >> x[i] >> y[i]; g[x[i]].push_back(y[i]); g[y[i]].push_back(x[i]); } for (int i = 1; i <= m; i++) { cin >> a[i] >> ccol[i]; col.push_back({ccol[i], i}); g2[x[a[i]]].push_back(i); g2[y[a[i]]].push_back(i); } sort(col.begin(), col.end()); for (int i = 0; i < m; i++) { ccol[col[i][1]] = i; } roots[0] = 0; dfs(1, 0); for (int j = 1; j < lg; j++) { for (int i = 1; i <= n; i++) { p[i][j] = p[p[i][j - 1]][j - 1]; } } for (int i = 0; i < k; i++) { ll s, e, gl, sl; cin >> s >> e >> gl >> sl; ll z = lca(s, e); cout << max(gl - query(roots[z], roots[s], roots[e], sl), -1ll) << '\n'; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int tests = 1; // cin >> tests; for (int i = 1; i <= tests; i++) { // cout << "Case #" << i << ": "; solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...