Submission #921764

#TimeUsernameProblemLanguageResultExecution timeMemory
921764sleepntsheepMagic Tree (CEOI19_magictree)C++17
0 / 100
1335 ms1048576 KiB
#include <iostream> #include <fstream> #include <iomanip> #include <cmath> #include <cassert> #include <cstring> #include <vector> #include <algorithm> #include <deque> #include <set> #include <utility> #include <array> #include <complex> using u32 = unsigned; using i32 = int; using i64 = long long; using u64 = unsigned long long; using f64 = double; using f80 = long double; #define int long long using namespace std; using pt = complex<f80>; #define ALL(x) begin(x), end(x) #define ShinLena cin.tie(nullptr)->sync_with_stdio(false); #define N 100005 set<pair<int, i64>> s[N]; int n, m, k; i64 dp[N]; basic_string<int> g[N]; deque<pair<int, i64>> pre[N]; void dfs(int u) { i64 nocur = 0, cur = 0, fruit = s[u].size(), d; if (fruit) tie(d, cur) = *s[u].begin(); for (auto v : g[u]) { dfs(v); nocur += dp[v]; if (s[v].size() > s[u].size()) s[v].swap(s[u]); for (auto &[x, x2] : s[v]) { auto it = s[u].lower_bound(make_pair(x, 0)); if (it != s[u].end() and it->first == x) { int nw = it->second + x2; s[u].erase(it); s[u].emplace(x, nw); } else s[u].emplace(x, x2); } set<pair<int, i64>>().swap(s[v]); } { pre[u].emplace_back(k+1, 0); for (auto &[x, x2] : s[u]) pre[u].emplace_back(x, x2); //for (int i = (int)pre[u].size() - 2; i >= 0; --i) pre[u][i].second += pre[u][i+1].second; for (int i = 1; i < (int)pre[u].size(); ++i) pre[u][i].second += pre[u][i-1].second; } if (!fruit) return void(dp[u] = nocur); for (auto v : g[u]) { int l = 0, r = (int)pre[v].size() - 1, z = -1; while (l <= r) { int m = (l+r)/2; if (pre[v][m].first <= d) l = m + 1, z = m; else r = m - 1; } if (z != -1) cur += pre[v][z].second; } dp[u] = max(cur, nocur); } signed main() { ShinLena; cin >> n >> m >> k; for (int i = 2, p; i <= n; ++i) cin >> p, g[p].push_back(i); for (int v, d, w, i = 0; i < m; ++i) { cin >> v >> d >> w; s[v].emplace(d, w); } dfs(1); cout << dp[1]; 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...