제출 #1262509

#제출 시각아이디문제언어결과실행 시간메모리
1262509minggaTwo Currencies (JOI23_currencies)C++20
30 / 100
673 ms62136 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 #define int long long const int mod = 1e9 + 7; const int inf = 2e9; const int N = 1e5 + 7; int n, up[N][20], m, h[N], q, L[N], R[N]; int cnt[N], in[N], out[N], ans[N]; pair<int, int> edge[N], que[N]; int timer; vector<int> g[N]; struct citizen { int u, v, p, gc, sc; } a[N]; vector<int> ev[N]; void dfs(int u, int p) { in[u] = ++timer; for(int i = 1; i < 20; i++) up[u][i] = up[up[u][i - 1]][i - 1]; for(int v : g[u]) { if(v == p) continue; up[v][0] = u; h[v] = h[u] + 1; dfs(v, u); } out[u] = timer; } int lca(int u, int v) { if(h[u] < h[v]) swap(u, v); int k = h[u] - h[v]; for(int i = 0; (1 << i) <= k; i++) { if(k >> i & 1) u = up[u][i]; } if(u == v) return u; for(int i = 19; i >= 0; i--) { if(up[u][i] != up[v][i]) { u = up[u][i]; v = up[v][i]; } } return up[u][0]; } struct BIT { vector<ll> bit; int n; BIT() {} BIT(int n) : n(n) { bit.resize(n + 1, 0); } void update(int u, int x) { for(; u <= n; u += (u & -u)) bit[u] += x; } ll get(int u) { ll ans = 0; for(; u > 0; u -= (u & -u)) ans += bit[u]; return ans; } void update(int l, int r, int x) { update(l, x); update(r + 1, -x); } }; 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 >> m >> q; for(int i = 1; i < n; i++) { int u, v; cin >> u >> v; g[u].pb(v); g[v].pb(u); edge[i] = {u, v}; } dfs(1, 0); for(int i = 1; i <= m; i++) { int id, p; cin >> id >> p; auto& [u, v] = edge[id]; if(u == up[v][0]) swap(u, v); cnt[u]++; que[i] = {p, id}; } sort(que + 1, que + m + 1); for(int i = 1; i <= q; i++) { int u, v, gc, sc; cin >> u >> v >> gc >> sc; int p = lca(u, v); a[i] = {u, v, p, gc, sc}; L[i] = 1, R[i] = m; } for(int i = 1; i <= n; i++) { int u = in[i]; cnt[u] += cnt[up[u][0]]; } while(1) { bool ok = 0; for(int i = 1; i <= q; i++) { if(L[i] <= R[i]) { int m = (L[i] + R[i]) >> 1; ev[m].pb(i); ok = 1; } } if(!ok) break; BIT bit1(n), bit2(n); for(int i = 1; i <= m; i++) { auto [p, eid] = que[i]; auto [u, v] = edge[eid]; bit1.update(in[u], out[u], 1); bit2.update(in[u], out[u], p); for(int id : ev[i]) { auto [u, v, p, gc, sc] = a[id]; ll req = bit2.get(in[u]) + bit2.get(in[v]) - 2 * bit2.get(in[p]); if(req <= sc) { L[id] = i + 1; ans[id] = bit1.get(in[u]) + bit1.get(in[v]) - 2 * bit1.get(in[p]); } else R[id] = i - 1; } ev[i].clear(); } } for(int i = 1; i <= q; i++) { auto [u, v, p, gc, sc] = a[i]; int tot = cnt[u] + cnt[v] - 2 * cnt[p]; // cerr << tot << ' ' << ans[i] << ln; if(tot - ans[i] <= gc) { cout << gc - max(0ll, tot - ans[i]) << ln; } else { cout << -1 << ln; } } cerr << "\nTime: " << clock() * 1000 / CLOCKS_PER_SEC; }

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

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