From 1f591f770dc0c36ff394ff5b48b6af67b7288468 Mon Sep 17 00:00:00 2001 From: oncsr Date: Thu, 8 May 2025 16:39:03 +0900 Subject: [PATCH] =?UTF-8?q?[20250508]=20BOJ=20/=20P1=20/=20=EA=B3=A0?= =?UTF-8?q?=EC=96=91=EC=9D=B4=20=EC=86=8C=EA=B0=9C=ED=8C=85=20/=20?= =?UTF-8?q?=EA=B6=8C=ED=98=81=EC=A4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4 \354\206\214\352\260\234\355\214\205.md" | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 "khj20006/202505/08 BOJ P1 \352\263\240\354\226\221\354\235\264 \354\206\214\352\260\234\355\214\205.md" diff --git "a/khj20006/202505/08 BOJ P1 \352\263\240\354\226\221\354\235\264 \354\206\214\352\260\234\355\214\205.md" "b/khj20006/202505/08 BOJ P1 \352\263\240\354\226\221\354\235\264 \354\206\214\352\260\234\355\214\205.md" new file mode 100644 index 00000000..e5c600b9 --- /dev/null +++ "b/khj20006/202505/08 BOJ P1 \352\263\240\354\226\221\354\235\264 \354\206\214\352\260\234\355\214\205.md" @@ -0,0 +1,61 @@ +```cpp +#include +#include +#include +#include +using namespace std; +using ll = long long; + +int N; +ll C[200001]{}, H[200001]{}, par[200001]{}, dist[200001]{}, V[200001]{}; +map M[200001]{}; +vector>> T(200001); + +ll ans = 0; + +void dfs(int n) { + for (auto[i, c] : T[n]) { + dfs(i); + V[i] += c; + if (M[i].size() > M[n].size()) swap(M[i], M[n]), swap(V[i], V[n]); + for (auto[d, x] : M[i]) M[n][d + V[i] - V[n]] += x; + M[i] = map(); + } + if (H[n] != -1) { + H[n] -= V[n]; + auto it = M[n].upper_bound(H[n]); + if (it == M[n].begin()) return; + it--; + vector er; + while (C[n] > 0) { + ll am = min(it->second, C[n]); + C[n] -= am; + ans += am; + M[n][it->first] -= am; + if (am == it->second) er.push_back(it->first); + if (it == M[n].begin()) break; + it--; + } + for (ll i : er) M[n].erase(i); + } +} + +int main() { + cin.tie(0)->sync_with_stdio(0); + + cin >> N; + for (int i = 1; i <= N; i++) cin >> C[i]; + for (int i = 1; i <= N; i++) cin >> H[i]; + for (int i = 2; i <= N; i++) cin >> par[i]; + for (int i = 2; i <= N; i++) { + cin >> dist[i]; + T[par[i]].emplace_back(i, dist[i]); + } + + for (int i = 1; i <= N; i++) if (H[i] == -1) M[i].insert({ 0,C[i] }); + dfs(1); + + cout << ans; + +} +```