Submission #1214819

#TimeUsernameProblemLanguageResultExecution timeMemory
1214819biankJobs (BOI24_jobs)C++20
100 / 100
178 ms86464 KiB
#include <bits/stdc++.h>
 
using namespace std;
 
#define forn(i,n) for(int i=0;i<int(n);i++)
#define forsn(i,s,n) for(int i=int(s);i<int(n);i++)
#define dforn(i,n) for(int i=int(n)-1;i>=0;i--)
#define dforsn(i,s,n) for(int i=int(n)-1;i>=int(s);i--)
#define fst first
#define snd second
#define pb push_back
#define eb emplace_back
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
 
typedef long long ll;
typedef vector<ll> vll;
typedef vector<int> vi;
typedef pair<int,int> ii;
 
const int N = 3e5 + 9;
 
vi adj[N];
ll x[N];
int p[N];
 
struct Element {
    ll sum, mini;
    int first;
    Element(ll a, ll b, int c) : sum(a), mini(b), first(c) {}
    bool operator<(const Element &o) const {
        if (mini != o.mini) return mini < o.mini;
        return sum > o.sum;
    }
};
 
priority_queue<Element> pq[N];
 
void dfs(int u) {
    for (int v : adj[u]) {
        dfs(v);
        if (sz(pq[v]) > sz(pq[u])) {
            swap(pq[u], pq[v]);
        }
        while (!pq[v].empty()) {
            pq[u].push(pq[v].top());
            pq[v].pop();
        }
    }
    Element e = {x[u], min(x[u], 0LL), u};
    while (!pq[u].empty() && (e.sum <= 0 || pq[u].top().mini >= e.mini)) {
        e.mini = min(e.mini, e.sum + pq[u].top().mini);
        e.sum += pq[u].top().sum;
        pq[u].pop();
    }
    if (e.sum > 0) {
        pq[u].push(e);
    }
}
 
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int n; ll s;
    cin >> n >> s;
    forsn(i, 1, n + 1) {
        cin >> x[i] >> p[i];
        adj[p[i]].push_back(i);
    }
    dfs(0);
    ll res = s;
    while (!pq[0].empty()) {
        auto e = pq[0].top(); pq[0].pop();
        if (res + e.mini < 0) break;
        res += e.sum;
    }
    cout << res - s << '\n';
    
    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...