Submission #1345702

#TimeUsernameProblemLanguageResultExecution timeMemory
1345702avighnaWorst Reporter 4 (JOI21_worst_reporter4)C++20
14 / 100
2096 ms98284 KiB
#include <bits/stdc++.h>

using namespace std;

const int64_t inf = 1e15;

int main() {
  cin.tie(nullptr)->sync_with_stdio(false);

  int n;
  cin >> n;
  vector<vector<int>> adj(n + 1);
  vector<int> h(n + 1), c(n + 1), buff;
  for (int i = 1, a; i <= n; ++i) {
    cin >> a >> h[i] >> c[i];
    if (a != i) {
      adj[a].push_back(i);
    }
    buff.push_back(h[i]);
  }

  sort(buff.begin(), buff.end());
  buff.erase(unique(buff.begin(), buff.end()), buff.end());
  auto compr = [&](int i) { return lower_bound(buff.begin(), buff.end(), i) - buff.begin(); };

  for (int i = 1; i <= n; ++i) {
    h[i] = compr(h[i]);
  }

  auto dfs = [&](auto &&self, int u) -> map<int, int64_t> {
    map<int, int64_t> dp;
    dp[h[u]] = -c[u], dp[0] = c[u] * (h[u] != 0), dp[h[u] + 1] = c[u];
    for (int &i : adj[u]) {
      auto ch = self(self, i);
      if (dp.size() < ch.size()) {
        swap(dp, ch);
      }
      for (auto &[i, val] : ch) {
        dp[i] += val;
        if (dp[i] == 0 && i != 0) {
          dp.erase(i);
        }
      }
    }
    for (auto it = dp.find(h[u]); it != dp.begin() && it->second < 0; --it) {
      prev(it)->second += exchange(it->second, 0);
    }
    return dp;
  };
  cout << dfs(dfs, 1).begin()->second << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...