Submission #1299764

#TimeUsernameProblemLanguageResultExecution timeMemory
1299764KindaGoodGamesJobs (BOI24_jobs)C++20
14 / 100
2094 ms21392 KiB
#include<bits/stdc++.h>

using namespace std;

#define int long long
#define pii pair<int,int>
#define tiii tuple<int,int,int> 

int mod = 1e9+7; 
vector<vector<int>> adj;
vector<int>val;
vector<bool> taken;

void DFS(int v,int p, int cur, int limit, pii& best){
    cur += val[v];
    if(cur < -limit){
        return;
    } 
    best = max(best,{cur,v}); 
    int s = 0;
    for(auto u : adj[v]){
        DFS(u,v,cur,limit,best);
    } 
}

int32_t main(){
    int n, s;
    cin >> n >> s; 

    int os = s;
    adj.resize(n);
    val.resize(n);
    taken.resize(n);
    vector<int> par(n,-1);
 
    vector<int> roots;
    for(int i = 0; i < n; i++){
        cin >> val[i];
        int p;
        cin >> p;
        p--;
        par[i] = p;
        if(p != -1){
            adj[p].push_back(i);
        }else{
            roots.push_back(i);
        }
    }

    int left = n;
    while(true){ 
        pii best = {-1e9,-1e9};
        for(auto r : roots){
            DFS(r,r,0,s,best);
        }

        if(best.first <= 0) break; 
        int v = best.second;
        s += best.first;
        while(v != -1){ 
            taken[v] = true;  
            val[v] = 0;
            v = par[v];
        }
    }
     
    cout << s-os << "\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...