Submission #674933

#TimeUsernameProblemLanguageResultExecution timeMemory
674933skittles1412Worst Reporter 4 (JOI21_worst_reporter4)C++17
14 / 100
134 ms201812 KiB
#include "bits/extc++.h"

using namespace std;

template <typename T>
void dbgh(const T& t) {
    cerr << t << endl;
}

template <typename T, typename... U>
void dbgh(const T& t, const U&... u) {
    cerr << t << " | ";
    dbgh(u...);
}

#ifdef DEBUG
#define dbg(...)                                           \
    cerr << "L" << __LINE__ << " [" << #__VA_ARGS__ << "]" \
         << ": ";                                          \
    dbgh(__VA_ARGS__)
#else
#define cerr   \
    if (false) \
    cerr
#define dbg(...)
#endif

#define endl "\n"
#define long int64_t
#define sz(x) int(std::size(x))

struct DS {
    static constexpr int maxn = 5005;

    array<long, maxn> v {};

    friend void merge(DS& a, DS& b) {
        for (int i = 0; i < maxn; i++) {
            a.v[i] += b.v[i];
        }
    }

    long get(int i) const {
        return v[i];
    }

    void upd_add(long x) {
        for (auto& a : v) {
            a += x;
        }
    }

    void upd_min(int r, long x) {
        for (int i = 0; i <= r; i++) {
            assert(v[i] <= v[i + 1]);
            v[i] = min(v[i], x);
        }
    }
};

constexpr int maxn = 2e5 + 5;

int arr[maxn], cost[maxn];
vector<int> graph[maxn];

DS dp(int u, int p = -1) {
    DS cur;
    long cans = 0;
    for (auto& v : graph[u]) {
        if (v == p) {
            continue;
        }
        auto&& ndp = dp(v, u);
        cans += ndp.get(arr[u]);
        merge(cur, ndp);
    }
    cur.upd_add(cost[u]);
    cur.upd_min(arr[u], cans);
    return cur;
}

void solve() {
    int n;
    cin >> n;
    int par[n];
    for (int i = 0; i < n; i++) {
        cin >> par[i] >> arr[i] >> cost[i];
        par[i]--;
    }
    for (int i = 1; i < n; i++) {
        graph[par[i]].push_back(i);
    }
    vector<int> comp(arr, arr + n);
    sort(begin(comp), end(comp));
    comp.erase(unique(begin(comp), end(comp)), comp.end());
    for (int i = 0; i < n; i++) {
        arr[i] =
            int(lower_bound(begin(comp), end(comp), arr[i]) - comp.begin());
    }
    cout << dp(0).get(0) << endl;
}

int main() {
    cin.tie(nullptr);
    cin.exceptions(ios::failbit);
    ios_base::sync_with_stdio(false);
    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...