#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 time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |