Submission #1215906

#TimeUsernameProblemLanguageResultExecution timeMemory
1215906onbertWorst Reporter 4 (JOI21_worst_reporter4)C++20
100 / 100
261 ms61544 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 2e5 + 5, INF = 1e10;
int n;
vector<int> adj[maxn];
int p[maxn], a[maxn], c[maxn];

int dsu[maxn];
multiset<pair<int,int>> s[maxn];

int rt(int u) {
    if (dsu[u] == u) return u;
    return dsu[u] = rt(dsu[u]);
}
void merge(int u, int v) {
    u = rt(u), v = rt(v);
    if (s[u].size() > s[v].size()) swap(u, v);
    dsu[u] = v;
    for (auto [x, y]:s[u]) s[v].insert({x, y});
    while (s[u].size()) s[u].erase(s[u].begin());
}

void dfs(int u) {
    for (int v:adj[u]) {
        dfs(v);
        merge(u, v);
    }
    int U = rt(u);
    int val = -c[u];
    while (s[U].size() && s[U].begin()->first < a[u]) {
        pair<int,int> cur = *prev(s[U].lower_bound({a[u], -INF}));
        s[U].erase(s[U].find(cur));
        val += cur.second;
        if (val > 0) {
            s[U].insert({cur.first, val});
            break;
        }
    }
    s[U].insert({a[u], c[u]});
}

signed main() {
    ios::sync_with_stdio(0); cin.tie(0);
    cin >> n;
    int all = 0;
    for (int i=1;i<=n;i++) {
        cin >> p[i] >> a[i] >> c[i];
        adj[p[i]].push_back(i);
        all += c[i];
    }


    for (int i=1;i<=n;i++) dsu[i] = i;

    int vis[maxn];
    bool inloop[maxn];
    for (int i=1;i<=n;i++) vis[i] = inloop[i] = 0;
    int ans = 0;
    for (int i=1;i<=n;i++) if (!vis[i]) {
        vector<int> track;
        int u = i;
        int last = -1;
        // cout << i << endl;
        while (true) {
            // cout << u << " ";
            vis[u] = 1, track.push_back(u);
            int v = p[u];
            if (vis[v] == 1) {
                last = v;
                break;
            } else if (vis[v] == 2) break;
            u = v;
        }
        // cout << endl;
        for (int j:track) vis[j] = 2;
        if (last == -1) continue;

        for (int j=(int)track.size()-1;j>=0;j--) {
            inloop[track[j]] = true;
            if (track[j] == last) break;
        }

        // cout << i << endl;

        map<int,int> mp;
        while (track.size()) {
            u = track.back();
            mp[a[u]] += c[u];
            // cout << u << endl;
            for (int v:adj[u]) if (!inloop[v]) {
                // cout << "test " << v << endl;
                dfs(v);
                merge(last, v);
            }
            if (u == last) break;
            track.pop_back();
        }
        vector<pair<int,int>> loop = {{0, 0}};
        for (auto [x, y]:mp) loop.push_back({x, y});
        vector<pair<int,int>> vec;
        for (auto [x, y]:s[rt(last)]) vec.push_back({x, y});
        reverse(vec.begin(), vec.end());
        int pt = loop.size();
        int cur = 0, curmx = 0, curans = 0;
        for (auto [x, y]:vec) {
            while (pt-1 >= 0 && loop[pt-1].first > x) {
                pt--;
                curans = max(curmx + loop[pt].second, curans);
            }
            cur += y;
            curmx = max(curmx, cur);
        }
        while (pt-1 >= 0) {
            pt--;
            curans = max(curmx + loop[pt].second, curans);
        }
        ans += curans;
        // cout << i << endl;
        // cout << ans << endl;
    }
    cout << all - ans << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...