Submission #1355918

#TimeUsernameProblemLanguageResultExecution timeMemory
1355918AvianshJobs (BOI24_jobs)C++20
0 / 100
109 ms42888 KiB
#include <bits/stdc++.h>

using namespace std;

const long long inf = 2e18;

void dfs(int st, vector<int>g[], long long x[], set<array<long long,2>>costs[]){
    for(int i : g[st]){
        dfs(i,g,x,costs);
    }
    for(int i : g[st]){
        if(costs[i].size()>costs[st].size()){
            swap(costs[i],costs[st]);
        }
        for(array <long long,2>a:costs[i]){
            costs[st].insert(a);
        }
    }
    array<long long,2>ne = {x[st],x[st]};
    while(costs[st].size()&&ne>(*--costs[st].end())){
        ///merge ne and costs[st].end()
        array<long long,2>cur = (*--costs[st].end());
        costs[st].erase(--costs[st].end());
        ne[0]=min(ne[0],cur[0]+ne[1]);
        ne[1]+=cur[1];
    }

    while(costs[st].size()&&ne[1]<0){
        ///merge ne and costs[st].end()
        array<long long,2>cur = (*--costs[st].end());
        costs[st].erase(--costs[st].end());
        ne[0]=min(ne[0],cur[0]+ne[1]);
        ne[1]+=cur[1];
    }
    if(ne[1]<0){
        costs[st].clear();
    }
    else{
        costs[st].insert(ne);
    }
    /*
    ///time to make my own costs.
    deque<array<long long,2>>curr;
    int curi = 1;
    curr.push_back({x[st],x[st]});
    if(g[st].size()){
        vector<int>inds(g[st].size(),0);
        while(curi<sz+1){
            array<long long,2> mx = {-inf,0};
            int lasi = -1;
            for(int i = 0;i<g[st].size();i++){
                if(inds[i]==costs[g[st][i]].size()){
                    continue;
                }
                if(costs[g[st][i]][inds[i]]>mx){
                    lasi=i;
                    mx=costs[g[st][i]][inds[i]];
                }
            }
            curr.push_back(mx);
            inds[lasi]++;
            curi++;
        }
    }
    while(curr[0][1]<0){
        ///merge curr[0],curr[1].
        array<long long,2>ne = curr[0];
        curr.pop_front();
        if(curr.size()){
            ne[0]=min(ne[0],curr[0][0]+ne[1]);
            ne[1]+=curr[0][1];
            curr[0]=ne;
        }
        else{
            break;
        }
    }
    costs[st]=curr;
    */
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n;
    long long s;
    cin >> n >> s;
    n++;
    vector<int>g[n];
    long long x[n];
    for(int i = 1;i<n;i++){
        cin >> x[i];
        int p;
        cin >> p;
        g[p].push_back(i);
    }
    x[0]=s;
    ///graph is connected, 0 is overall root, start with sum 0.
    set<array<long long,2>>costs[n];
    dfs(0,g,x,costs);
    long long ans = 0;
    auto it = costs[0].end();
    while(it!=costs[0].begin()){
        it--;
        array<long long,2>a = *it;
        if(ans>=-a[0]){
            ans+=a[1];
        }
        else{
            break;
        }
    }
    cout << ans-s;
    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...