Submission #1350796

#TimeUsernameProblemLanguageResultExecution timeMemory
1350796pandaa73Jobs (BOI24_jobs)C++20
0 / 100
112 ms35192 KiB
#include <bits/stdc++.h>
using namespace std;

#define ff endl
#define lf "\n"
#define fi first
#define se second
#define _ << ' ' <<
#define all(x) begin(x),end(x)
#define rall(x) rbegin(x),rend(x)

#ifdef DEBUG

constexpr bool IS_DEBUG = 1;

#define infor(fmt, ...) do { print(stderr, fmt, ##__VA_ARGS__); } while(0)
#define infof(fmt, ...) do { println(stderr, fmt, ##__VA_ARGS__); } while(0)

#else

constexpr bool IS_DEBUG = 0;

#define infor(fmt, ...)
#define infof(fmt, ...)

#endif

using ll = long long;

using pll = pair<ll, ll>;
using pii = pair<int, int>;

template<typename... Args>
using vec = vector<Args...>;

constexpr int LOG = 20;
constexpr int MOD = 1e9+7;
constexpr int MAXN = 1e5+7;

mt19937 timmy_loves_gambling(73);

constexpr ll INF = 2e18;

struct MonotonicMap {
    void prune(void) {
        ll mx = -INF;

        auto it = m.begin();
        for(; it != m.end() && it->fi <= lz; it = m.erase(it)) {
            mx = max(mx, it->se);
        }

        if(mx > -INF) {
            m.emplace(lz, mx);
        }

        it = m.begin();
        for(; it != m.end() && it->se + lz < 0; it = m.erase(it));
    }

    ll get_min(void) {
        prune();
        return m.empty() ? INF : m.begin()->fi - lz;
    }

    void apply(ll x) {
        lz += x;
        prune();
    }

    void push(ll k, ll v) {
        if(v < 0) return;
        k += lz, v -= lz;

        auto it = m.upper_bound(k);
        for(; it != m.end() && it->se <= v; it = m.erase(it));

        if(it == m.begin() || prev(it)->se < v) {
            m.emplace(k, v);
        }

        prune();
    }

    ll lz;
    map<ll, ll> m;
};

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int N; cin >> N;
    ll S; cin >> S;

    vec<int> F(N + 1); iota(all(F), 0);

    vec<ll> W(N + 1);
    vec<vec<int>> adj(N + 1);
    for(int i = 1; i <= N; ++i) {
        int x, p; cin >> x >> p;

        adj[F[p]].emplace_back(i);

        if(x > 0) F[i] = F[p];

        W[F[i]] += x;
    }

    vec<ll> mn(N + 1, INF);
    auto dfs = [&](int v, auto &&dfs) -> MonotonicMap {
        MonotonicMap m;

        for(auto u: adj[v]) {
            auto n = dfs(u, dfs);
            n.apply(W[v]);

            if(n.m.size() > m.m.size()) {
                swap(n, m);
            }

            for(auto [k, v]: n.m) {
                m.push(k - n.lz, v + n.lz);
            }
        }

        if(W[v] >= 0) {
            m.push(0, W[v]);
        }

        mn[v] = m.get_min();

        return m;
    };

    dfs(0, dfs);

    ll s = S;
    priority_queue<pll, vec<pll>, greater<pll>> q; q.emplace(0, 0);
    while(!q.empty()) {
        auto [m, v] = q.top(); q.pop();

        if(s < m) break;
        s += W[v];

        for(auto u: adj[v]) {
            q.emplace(mn[u], u);
        }
    }

    cout << s - S << lf;
}
#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...