Submission #973969

#TimeUsernameProblemLanguageResultExecution timeMemory
973969phoenixWorst Reporter 4 (JOI21_worst_reporter4)C++17
100 / 100
345 ms195644 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int N = 200200;

int n;

int p[N];
int h[N];
int c[N];

map<int, ll> mp[N];
vector<int> g[N];

// u <- v
void join(int u, int v) {
    if ((int)mp[u].size() < (int)mp[v].size()) swap(mp[u], mp[v]);
    for (auto c : mp[v]) 
        mp[u][c.first] += c.second; 
};

bool vis[N];

void dfs(int v) {
    vis[v] = true;
    for (int to : g[v]) {
        dfs(to);
        join(v, to);
    }
    int s = c[v];
    auto it = mp[v].upper_bound(h[v]);
    while (it != mp[v].begin()) {
        it--;
        if (s >= it->second) {
            s -= it->second;
            mp[v].erase(it);
        } else {
            mp[v][it->first] = it->second - s;
            s = 0;
            break;
        }
        it = mp[v].upper_bound(h[v]);
    }
    mp[v][0] += c[v] - s;
    mp[v][h[v] + 1] += c[v];    
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i++) 
        cin >> p[i] >> h[i] >> c[i];

    vector<deque<int>> cycles;

    for (int i = 1; i <= n; i++) if (!vis[i]) {
        deque<int> cyc;
        int x = i;
        while (!vis[x]) {
            vis[x] = true;
            cyc.push_back(x);
            x = p[x];
        }
        while (!cyc.empty() && cyc.front() != x) cyc.pop_front();
        // cout << '{';
        // for (int c : cyc) cout << c << ' ';
        // cout << '}' << '\n';
        if (!cyc.empty()) 
            cycles.push_back(cyc);
    }    
    for (int i = 1; i <= n; i++) vis[i] = false;

    for (auto c : cycles) for (int x : c) 
        vis[x] = true;
    for (int i = 1; i <= n; i++) if (!vis[i]) 
        g[p[i]].push_back(i);

    ll res = 0;
    for (auto cyc : cycles) {
        for (int v : cyc) {
            for (int to : g[v]) {
                dfs(to);   
                join(v, to);
            }
            mp[v][0] += c[v];
            mp[v][h[v]] -= c[v];
            mp[v][h[v] + 1] += c[v];
        }
        for (int v : cyc)
            if (v != cyc.back()) 
                join(cyc.back(), v);
        ll val = 0;
        ll mn = 1e18;
        for (auto c : mp[cyc.back()]) {
            val += c.second;
            if (val < mn) mn = val;
        }   
        res += mn;
    }
    cout << res;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...