Submission #1059124

#TimeUsernameProblemLanguageResultExecution timeMemory
1059124TonylJobs (BOI24_jobs)C++17
100 / 100
241 ms83908 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define int ll
using vi = vector<int>;
using pi = pair<ll,ll>;
#define REP(i,n) for (int i = 0; i < n; i++)
#define trav(a,x) for (auto& a : x)
#define D(x) //cerr << #x << ": " << x << endl;
#define all(x) (x).begin(), (x).end()
const int MAX_N = 3*1e5+3;

struct Info {
    map<ll, ll> rew;

    void add(int r) {
        if (r == 0) return;
        if (r > 0) {
            rew[0] += r;
        } else {
            r*=-1;
            ll rr = r;
            //off += r;
            // go erasing

            while (rew.size() && rr) {
                if (rew.begin()->second > rr) {
                    rew.begin()->second -= rr;
                    rr = 0;
                } else {
                    rr -= rew.begin()->second;
                    rew.erase(rew.begin());
                    r = rr;
                }
            }

            if (rew.size() == 0) return;
            // move
            ll stole = 0;
            ll bef = 0;
            while (rew.size() && stole == 0) {
                bef = rew.begin()->first;
                stole += rew.begin()->second;
                rew.erase(rew.begin());
            }
            bef += r;
            while (rew.size() && rew.begin()->first < bef) {
                stole += rew.begin()->second;
                rew.erase(rew.begin());
            }
            assert(stole > 0);
            rew[bef] += stole;
        }
    }

    void merge(Info* other) {
        trav(o, other->rew) {
            ll re = o.first;
            rew[re] += o.second;
        }
        delete other;
    }

    ~Info() {
        rew.clear();
    }
};

int n; ll s;
vi children[MAX_N];
int values[MAX_N];
bool done[MAX_N];

Info* dfs(int i) {
    done[i] = 1;

    Info* info = new Info;
    trav(ch, children[i]) {
        Info* other = dfs(ch);
        if (info->rew.size() < other->rew.size()) swap(info, other);
        info->merge(other);
    }
    info->add(values[i]);
    return info;
}

ll triv_dfs(int i) {
    done[i] = 1;
    ll tot = values[i];
    trav(ch, children[i]) tot += triv_dfs(ch);
    return max(tot, 0ll);
}

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

    priority_queue<pi, vector<pi>, greater<pi>> q;

    cin >> n >> s;
    ll ss = s;

    REP(i,n) {
        int p; cin >> values[i] >> p;
        if (p == 0) continue;
        p--;

        children[p].push_back(i);
    }

    REP(i,n) {
        if (done[i]) continue;
        Info* info = dfs(i);
        trav(r, info->rew) {
            q.push({r.first, r.second});
        }
    }

    while (q.size()) {
        auto r = q.top(); q.pop();
        D(r.first);
        D(r.second);
        if (r.first <= s) s += r.second;
        assert(r.second > 0);
        //else break;
    }

    assert(s >= ss);
    cout << s - ss << endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...