Submission #1343606

#TimeUsernameProblemLanguageResultExecution timeMemory
1343606LIAWorst Reporter 4 (JOI21_worst_reporter4)C++17
79 / 100
382 ms136684 KiB
//
// Created by liasa on 28/03/2026.
//
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define vll vector<ll>
#define vvll vector<vll>
#define lp(i, s, e) for (ll i = s; i < e; ++i)

ll n;
vll H, C, A,sz;
vvll g, rg;

ll cntCol = 0;
vll vis, ord, col;
set<ll> s;
vll vals, dar;
ll m;

/*
void dfs(ll node) {
  vis[node] = 1;
  for (auto it : g[node]) {
    if (!vis[it])
      dfs(it);
  }
  ord.push_back(node);
}

void dfs1(ll node) {
  vis[node] = 1;
  col[node] = cntCol;
  for (auto it : rg[node]) {
    if (!vis[it])
      dfs1(it);
  }
}

void build_scc() {
  vis.resize(n, 0), col.resize(n, 0);
  lp(i, 0, n) {
    if (!vis[i])
      dfs(i);
  }
  vis.assign(n, 0);
  for (ll i = n - 1; i >= 0; --i) {
    if (!vis[ord[i]]) {
      dfs1(ord[i]);
      cntCol++;
    }
  }
}

*/
ll get_idx(ll val) {
  ll idx = lower_bound(vals.begin(), vals.end(), val) - vals.begin();
  return idx;
}
vector<map<ll,ll>> dp;
void calc() {
  queue<ll> q;
  lp(i, 0, n) {
    if (dar[i] == 0)
      q.push(i);
  }

  while (!q.empty()) {
    auto node = q.front();
    q.pop();


    ll hv =-1, mx=-1;
    for (auto it : rg[node]) {
      if (sz[it]>mx) {
        mx=sz[it];
        hv=it;
      }
    }

    if (hv!=-1) {

      swap(dp[hv], dp[node]);
      for (auto it : rg[node]) {
        if (it!=hv) {
          for (auto [pos, del]:dp[it]){
           dp[node][pos]+=del;
          }
        }
      }
    }

    dp[node][H[node]]+=C[node];

    auto it = dp[node].lower_bound(H[node]);

    ll budget =C[node];

    while (it != dp[node].begin() && budget > 0) {
      auto prev_it = prev(it);
      if (prev_it->second <= budget) {
        budget -= prev_it->second;
        dp[node].erase(prev_it);
      } else {
        prev_it->second -= budget;
        budget = 0;
      }
    }

    for (auto it : g[node]) {
      if (--dar[it] == 0)
        q.push(it);
    }
  }
}

void dfs_sz(ll node) {
  vis[node] = 1;
  sz[node]=1;
  for (auto it : rg[node]) {
    if (!vis[it]) {
      dfs_sz(it);
      sz[node]+=sz[it];
    }
  }
}

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  cin >> n;
  H.resize(n), C.resize(n), A.resize(n);
  g.resize(n), rg.resize(n), vis.resize(n, 0);
  dar.resize(n);
  ll sumi=0;
  lp(i, 0, n) {
    cin >> A[i] >> H[i] >> C[i];
    A[i]--;
    s.insert(H[i]);
    sumi+=C[i];
    g[i].push_back(A[i]);
    if (A[i] != i)
      dar[A[i]]++;
    rg[A[i]].push_back(i);
  }

  // build_scc();
  m = s.size();
  for (auto it : s)
    vals.push_back(it);

  dp.resize(n);
  vis.assign(n,0);
  sz.resize(n);
  dfs_sz(0);
  vis.assign(n,0);

  calc();
  ll ans = 0, cnt=0;

 for (auto [pos, del]:dp[0]){
   cnt+=del;
    ans = max(ans, cnt);
  }

  cout << sumi-ans << '\n';
}
/*
6
1 6 5
1 3 6
1 8 4
3 4 9
2 2 5
2 5 6
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...