This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
int N;
vector<int> root;
int h,h1;
vector<int> adjlst[300100];
long long int lst[300100];
int parent[300100];
const long long int inf = 2e18;
long long int money;
priority_queue<pair<long long int,long long int>,vector<pair<long long int,long long int>>,greater<pair<long long int,long long int>>> pq;
pair<set<pair<long long int,long long int>>*,long long int> dfs(int i){
//printf("%d",i);
pair<int,int> ii = {-1,-1};
vector<pair<set<pair<long long int,long long int>>*,long long int>> v;
for(int j : adjlst[i]){
v.push_back(dfs(j));
ii = max({(int)(v.back().first -> size()),v.size() - 1},ii);
}
//printf("%d",i);
set<pair<long long int,long long int>>* sat;
long long int offset = 0;
long long int va = lst[i];
long long int other = max(0LL,-lst[i]);
if(ii.first == -1){
sat = new set<pair<long long int,long long int>>();
if(lst[i] > 0) sat -> insert({0,lst[i]});
}
else{
sat = v[ii.second].first;
offset = v[ii.second].second;
if(lst[i] > 0) sat -> insert({- offset,lst[i]});
}
for(int i = 0; i < v.size(); i++){
if(i == ii.second) continue;
for(pair<long long int, long long int> pp : *(v[i].first) ){
pp.first = pp.first + v[i].second - offset;
sat -> insert(pp);
}
}
//offset -= min(0LL,va);
long long int num = 0;
num = -lst[i];
if(lst[i] < 0){
while(num != 0 && !(sat -> empty())){
auto it = sat -> begin();
long long int temp = min(num, it -> second);
num -= temp;
if(it -> second == temp){
sat -> erase(it);
}
else{
pair<long long int, long long int> ii = *it;
ii.second = ii.second - temp ;
sat -> erase(it);
sat -> insert(ii);
}
}
}
if(num != 0) return {sat,0};
other = sat -> begin() -> first + other;
while(sat -> lower_bound({-offset + other,inf}) != sat -> begin()){
auto it = sat -> lower_bound({-offset + other,inf});
advance(it,-1);
num += it -> second;
sat -> erase(it);
}
if(num != 0) sat -> insert({-offset + other, num});
return {sat,offset};
}
int main(){
scanf(" %d",&N);
scanf(" %lld",&money);
long long int init = money;
for(int i = 1; i <= N; i++){
scanf(" %d",&h);
scanf(" %d",&h1);
if(h1 == 0){
root.push_back(i);
}
else{
adjlst[h1].push_back(i);
}
lst[i] = h;
}
//printf("\n");
for(int i : root){
pair<set<pair<long long int,long long int>>*,long long int> ii = dfs(i);
for(pair<long long int, long long int> pp : *(ii.first)){
pp.first += ii.second;
//printf("%d %d\n",pp.first,pp.second);
pq.push(pp);
}
}
while(!pq.empty()){
if(money < pq.top().first) break;
money += pq.top().second;
pq.pop();
}
printf("%lld",money - init);
}
/*
5 104
-103 0
102 1
-103 2
55 3
50 3
*/
Compilation message (stderr)
Main.cpp: In function 'std::pair<std::set<std::pair<long long int, long long int> >*, long long int> dfs(int)':
Main.cpp:41:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::set<std::pair<long long int, long long int> >*, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
41 | for(int i = 0; i < v.size(); i++){
| ~~^~~~~~~~~~
Main.cpp:27:19: warning: unused variable 'va' [-Wunused-variable]
27 | long long int va = lst[i];
| ^~
Main.cpp: In function 'int main()':
Main.cpp:87:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
87 | scanf(" %d",&N);
| ~~~~~^~~~~~~~~~
Main.cpp:88:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
88 | scanf(" %lld",&money);
| ~~~~~^~~~~~~~~~~~~~~~
Main.cpp:93:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
93 | scanf(" %d",&h);
| ~~~~~^~~~~~~~~~
Main.cpp:94:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
94 | scanf(" %d",&h1);
| ~~~~~^~~~~~~~~~~
# | 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... |