Submission #1343157

#TimeUsernameProblemLanguageResultExecution timeMemory
1343157LIAWorst Reporter 4 (JOI21_worst_reporter4)C++17
14 / 100
1463 ms589824 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;
vvll g, rg;

ll cntCol = 0;
vll vis, ord, col;

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++;
    }
  }
}

set<ll> s;
vll vals, dar;
vvll dp;
ll m;

ll get_idx(ll val) {
  ll idx = lower_bound(vals.begin(), vals.end(), val) - vals.begin();
  return idx;
}

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();
    dp[node].resize(m);
    ll mini = 1e18;
    for (ll j = m - 1; j >= 0; --j) {
      ll add = (j == get_idx(H[node]) ? 0 : C[node]);
      ll sum = 0;
      for (auto it : rg[node]) {
        sum += dp[it][j];
      }
      sum += add;
      mini = min(mini, sum);
      dp[node][j] = mini;
    }

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

void dfsC(ll node) {
  vis[node] = 1;
  for (auto it : g[node]) {
    if (!vis[it]) {
      dfsC(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);

  lp(i, 0, n) {
    cin >> A[i] >> H[i] >> C[i];
    A[i]--;
    s.insert(H[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);

  calc();
  ll ans = 1e18;

  lp(j, 0, m) ans = min(ans, dp[0][j]);

  cout << ans << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...