제출 #1333148

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

#define int long long

const int N = 3e5 + 5;

int Values[N];

vector<int> Graph[N];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> Helper[N];

int Index[N];

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

void DFS(int u)
{
    Index[u] = u;

    for(auto v : Graph[u]) {
        DFS(v);

        if(Helper[Index[v]].size() > Helper[Index[u]].size()) 
            swap(Index[v], Index[u]);

        while(!Helper[Index[v]].empty()) {
            Helper[Index[u]].push(Helper[Index[v]].top());
            Helper[Index[v]].pop();
        }
    }

    pair<int, int> Block = make_pair(max(0ll, -Values[u]), Values[u]);

    while(true) {
        if(Helper[Index[u]].empty())
            break;

        if(Block.second <= 0) {
            Block.first = max(Block.first, Helper[Index[u]].top().first + (-Block.second));
            Block.second += Helper[Index[u]].top().second;
            Helper[Index[u]].pop();
        } else {
            if(Block.first <= Helper[Index[u]].top().first)
                break;
            Block.first = max(Block.first, Helper[Index[u]].top().first + (-Block.second));
            Block.second += Helper[Index[u]].top().second;
            Helper[Index[u]].pop();
        }
    }

    if(Block.second > 0) 
        Helper[Index[u]].push(Block);
}

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

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

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

    for(auto e : Graph[0]) {
        DFS(e);

        while(!Helper[Index[e]].empty()) {
            PQ.push(Helper[Index[e]].top());
            Helper[Index[e]].pop();
        }
    }

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

        s += PQ.top().second;
        PQ.pop();
    }

    cout << (s - starter) << "\n";
}
#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...