Submission #1279628

#TimeUsernameProblemLanguageResultExecution timeMemory
1279628not_amirMagic Tree (CEOI19_magictree)C++20
14 / 100
383 ms323008 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; struct vertex { vertex *vl = nullptr, *vr = nullptr; ll mxv = 0, add = 0; void extend(vertex *&v) { if (v == nullptr) v = new vertex(); } void update(int tl, int tr, int l, int r, ll val, ll sum = 0) { if (l >= r) return; sum += add; if (l == tl && r == tr) mxv = max(mxv, val - sum); else { int tm = (tl + tr) / 2; extend(vl), vl->update(tl, tm, l, min(r, tm), val, sum); extend(vr), vr->update(tm, tr, max(l, tm), r, val, sum); } } ll get_max(int tl, int tr, int x, ll sum = 0) { sum += add; if (tl + 1 == tr) return sum + mxv; int tm = (tl + tr) / 2; return max(sum + mxv, x < tm ? vl ? vl->get_max(tl, tm, x, sum) : 0 : vr ? vr->get_max(tm, tr, x, sum) : 0); } }; vertex* merge(int tl, int tr, vertex *v1, vertex *v2, ll m1 = 0, ll m2 = 0, ll s1 = 0, ll s2 = 0) { if (v1 == nullptr && v2 == nullptr) { vertex *v = new vertex(); v->mxv = m1 + m2; return v; } if (v1 == nullptr) { v2->add += m1 + s2; return v2; } if (v2 == nullptr) { v1->add += m2 + s1; return v1; } vertex *v = new vertex(); s1 += v1->add, s2 += v2->add; m1 = max(m1, s1 + v1->mxv), m2 = max(m2, s2 + v2->mxv); if (tl + 1 == tr) { v->mxv = m1 + m2; return v; } int tm = (tl + tr) / 2; v->vl = merge(tl, tm, v1->vl, v2->vl, m1, m2, s1, s2); v->vr = merge(tm, tr, v1->vr, v2->vr, m1, m2, s1, s2); return v; } typedef pair<int, int> pii; vector<vector<int>> G; vector<pii> fruits; int k; vertex *dfs(int v) { vertex *ret = new vertex(); for (int u : G[v]) ret = merge(0, k, ret, dfs(u)); auto [d, w] = fruits[v]; if (d) { ll mxv = ret->get_max(0, k, d); ret->update(0, k, d, k, mxv + w); } return ret; } int main() { cin.tie(nullptr)->sync_with_stdio(false); int n, m; cin >> n >> m >> k; k++; G.resize(n + 1); fruits.resize(n + 1); for (int i = 2; i <= n; i++) { int p; cin >> p; G[p].push_back(i); } for (int i = 0; i < m; i++) { int v, d, w; cin >> v >> d >> w; fruits[v] = {d, w}; } cout << dfs(1)->get_max(0, k, k - 1); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...