제출 #1254631

#제출 시각아이디문제언어결과실행 시간메모리
1254631phuocrucppTwo Currencies (JOI23_currencies)C++20
100 / 100
1364 ms37076 KiB
/*ㅤ∧_∧  ( ・∀・)  ( つ┳⊃ ε (_)へ⌒ヽフ (  ( ・ω・) ◎―◎ ⊃ ⊃ BePhuongSuperSuwi From TK4 - CHT ㅤㅤ/ ⌒\____   /・   )  \  /ノへ ノ    /| ノ   \\ |/_/_/*/ #include<bits/stdc++.h> #define task "main" #define endl '\n' #define pb push_back #define fi first #define se second #define ii pair<int,int> #define iii pair<int,ii> #define iv pair<ii, ii> #define base 341 #define MASK(i) (1ll << i) #define oo 1e18 using namespace std; const int maxn = 1e5 + 5; int n, m, test, l[maxn], r[maxn], res[maxn]; int h[maxn], par[maxn], heavy[maxn], head[maxn], pos[maxn], timer, ed[maxn]; vector<ii> v[maxn]; vector<int> query[maxn]; int dfs(int u, int p) { int max_son = 0, cur = 0; for (ii e : v[u]) { int x = e.fi, pos = e.se; if (x == p) continue; h[x] = h[u] + 1; par[x] = u; ed[pos] = x; int son = dfs(x, u); if (max_son < son) { max_son = son; heavy[u] = x; } cur += son; } return cur + 1; } void hld(int u, int h) { head[u] = h; pos[u] = ++timer; if (heavy[u]) hld(heavy[u], h); for (ii e : v[u]) { int x = e.fi; if (x != par[u] && x != heavy[u]) { hld(x, x); } } } struct HLD { long long bit[maxn]; void update(int pos, long long v) { for (int i = pos; i <= n; i += i & -i) bit[i] += v; } long long get(int pos) { long long res = 0; for (int i = pos; i ; i -= i & -i) res += bit[i]; return res; } long long getRange(int l, int r) { return get(r) - get(l - 1); } void change(int p, long long val) { update(pos[ed[p]], val); } long long query(int x, int y) { long long ans = 0; for (; head[x] != head[y]; y = par[head[y]]) { if (h[head[x]] > h[head[y]]) swap(x, y); ans += getRange(pos[head[y]], pos[y]); } if (h[x] > h[y]) swap(x, y); ans += getRange(pos[x] + 1, pos[y]); return ans; } void reset() { for (int i = 0; i <= n; i++) bit[i] = 0; } } hld1, hld2; struct pt { int p; long long c; } canh[maxn]; struct tv { int s, t; long long x, y; } q[maxn]; bool ss(pt a, pt b) { return a.c < b.c; } bool check(int id) { int l = q[id].s, r = q[id].t; return (hld1.query(l, r) <= q[id].y); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); if (fopen(task".inp", "r")) { freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); } cin >> n >> m >> test; for (int i = 1; i < n; i++) { int l, r; cin >> l >> r; v[l].pb({r, i}); v[r].pb({l, i}); } for (int i = 1; i <= m; i++) { cin >> canh[i].p >> canh[i].c; } sort(canh + 1, canh + m + 1, ss); for (int i = 1; i <= test; i++) { cin >> q[i].s >> q[i].t >> q[i].x >> q[i].y; l[i] = 0, r[i] = m, res[i] = -1; } dfs(1, -1); hld(1, 1); while (true) { bool ok = false; for (int i = 1; i <= test; i++) { if (l[i] > r[i]) continue; ok = true; int mid = (l[i] + r[i]) / 2; query[mid].pb(i); } if (!ok) break; hld1.reset(); hld2.reset(); for (int mid = 0; mid <= m; mid++) { if (mid > 0) { int p = canh[mid].p; long long val = canh[mid].c; hld1.change(p, val); hld2.change(p, 1); } for (auto id : query[mid]) { if (check(id)) { res[id] = hld2.query(q[id].s, q[id].t); l[id] = mid + 1; } else r[id] = mid - 1; } query[mid].clear(); } } hld2.reset(); for (int i = 1; i <= m; i++) { int p = canh[i].p; hld2.change(p, 1); } for (int i = 1; i <= test; i++) { int l = q[i].s, r = q[i].t; cout << max(-1ll, q[i].x - (hld2.query(l, r) - res[i])) << endl; } }

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

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