제출 #1332883

#제출 시각아이디문제언어결과실행 시간메모리
1332883dorkikannJobs (BOI24_jobs)C++20
0 / 100
116 ms23664 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

const int N = 3e5 + 5;
const int INF = 1e18;

int Value[N];
vector<int> Graph[N];

int Need[N];
int To[N];

bool Works[N];

priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> PQ;

bool DFS(int u)
{
    pair<int, int> mini = {INF, 0};

    for(auto v : Graph[u]) {
        if(DFS(v))
            mini = min(mini, {Need[v], v});
    }

    if(Value[u] >= 0) {
        Need[u] = 0;
        To[u] = u;
        return Works[u] = true;
    } else {
        if(mini.second == 0) 
            return Works[u] = false;
        Need[u] = mini.first + abs(Value[u]);
        To[u] = mini.second;
        
        return Works[u] = true;
    }
}

int Solve(int s)
{
    int starter = s;
    while(!PQ.empty()) {
        if(s < PQ.top().first)
            break;

        auto [d, u] = PQ.top();
        PQ.pop();
        
        do {
            s += Value[u];
            for(auto v : Graph[u]) {
                if(Works[v] && v != To[u]) 
                    PQ.push({Need[v], v}); 
            }
            if(u == To[u])
                break;

            u = To[u];
        }while(true);
    }

    return (s - starter);
}

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

    int n, s, x, p;
    cin >> n >> s;

    for(int i = 0; i < n; i++) {
        cin >> x >> p;
        Value[i+1] = x;
        Graph[p].push_back(i+1);
    }

    for(auto e : Graph[0]) {
        if(DFS(e))
            PQ.push({Need[e], e});
    }

    cout << Solve(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...