Submission #1237680

#TimeUsernameProblemLanguageResultExecution timeMemory
1237680badge881Magic Tree (CEOI19_magictree)C++20
100 / 100
78 ms28484 KiB
#include <bits/stdc++.h> #define int long long using namespace std; class Solver { public: Solver(int n, int m, int k) : n(n), m(m), k(k), listAdj(n + 1), fruitDays(n + 1, -1), fruitAmount(n + 1, 0) {} void addEdge(int parent, int child) { listAdj[parent].push_back(child); } void addFruit(int node, int day, int quantity) { fruitDays[node] = day; fruitAmount[node] = quantity; } int compute() { auto remainingJuice = dfs(1); int total = 0; for (auto &[day, amount] : remainingJuice) total += amount; return total; } private: int n, m, k; vector<vector<int>> listAdj; vector<int> fruitDays; vector<int> fruitAmount; map<int, int> dfs(int node) { map<int, int> juiceMap; for (int child : listAdj[node]) { auto childMap = dfs(child); if (childMap.size() > juiceMap.size()) swap(childMap, juiceMap); for (auto &[d, a] : childMap) { juiceMap[d] += a; } } int day = fruitDays[node]; int qty = fruitAmount[node]; if (qty > 0) { juiceMap[day] += qty; int toRemove = qty; auto it = juiceMap.upper_bound(day); while (it != juiceMap.end() && toRemove > 0) { if (toRemove >= it->second) { toRemove -= it->second; it = juiceMap.erase(it); } else { it->second -= toRemove; break; } } } return juiceMap; } }; signed main() { int n, m, k; scanf("%lld%lld%lld", &n, &m, &k); Solver solver(n, m, k); for (int i = 2; i <= n; ++i) { int parent; scanf("%lld", &parent); solver.addEdge(parent, i); } for (int i = 0; i < m; ++i) { int node, day, qty; scanf("%lld%lld%lld", &node, &day, &qty); solver.addFruit(node, day, qty); } printf("%lld\n", solver.compute()); }

Compilation message (stderr)

magictree.cpp: In function 'int main()':
magictree.cpp:86:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   86 |     scanf("%lld%lld%lld", &n, &m, &k);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
magictree.cpp:93:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   93 |         scanf("%lld", &parent);
      |         ~~~~~^~~~~~~~~~~~~~~~~
magictree.cpp:100:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  100 |         scanf("%lld%lld%lld", &node, &day, &qty);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...